我有映射爲以下實體:是由JPA支持的@ManyToMany(mappedBy = ...)+ @OrderColumn?
@Entity
@Table(name = "Groups")
@IdClass(value = GroupId.class)
public class Group implements Serializable
{
@Id
@Column(name = "round_id")
private Integer roundId;
@Id
@Column(name = "ordinal_nbr")
private Integer ordinalNbr = 0;
...
}
它有一個複合鍵(round_id, ordinal_nbr)
以指示組中的圓形的順序。
現在想象一下,一個連接包含通過自我引用(從集團到集團)連接有序組實體表:
CREATE TABLE GroupLinks
(
parent_round_id INTEGER NOT NULL,
parent_ordinal_nbr SMALLINT NOT NULL,
child_round_id INTEGER NOT NULL,
child_ordinal_nbr SMALLINT NOT NULL,
PRIMARY KEY (parent_round_id, parent_ordinal_nbr, child_round_id, child_ordinal_nbr),
FOREIGN KEY (parent_round_id, parent_ordinal_nbr) REFERENCES Groups (round_id, ordinal_nbr),
FOREIGN KEY (child_round_id, child_ordinal_nbr) REFERENCES Groups (round_id, ordinal_nbr)
);
我知道這是可能映射@ManyToMany
+ @JoinTable
+ @OrderColumn
爲擁有實體(無論我選擇):
@ManyToMany
@JoinTable(name = "GroupLinks", joinColumns = {@JoinColumn(name = "parent_round_id", referencedColumnName = "round_id"), @JoinColumn(name = "parent_ordinal_nbr", referencedColumnName = "ordinal_nbr")}, inverseJoinColumns = {@JoinColumn(name = "child_round_id", referencedColumnName = "round_id"), @JoinColumn(name = "child_ordinal_nbr", referencedColumnName = "ordinal_nbr")})
@OrderColumn(name = "child_ordinal_nbr")
private List<Group> children;
問:
對於自有方面,是否支持將@ManyToMany(mappedBy = ...)
與@OrderColumn
的相反關係映射?
@ManyToMany(mappedBy = "parents")
@OrderColumn(name = "parent_ordinal_nbr")
private List<Group> parents;
JPA 2規範是否定義允許或拒絕?
由於
更新1:
上面基本上是一個圖形結構。這裏有一個例子:
的GroupLinks
表包含盒裝實體。當僅查看B2 Group
實體時,parents
列表將包含(a,1,b,2)
和(a,2,b,2)
。至於children
列表,它將包含(b,2,c,1)
,(b,2,c,2)
和(b,2,c,3)
。
正如你可以看到的B2
名單不會發生碰撞的實體,這樣的@OrderColumn
應該工作沒關係的雙方關係parents
和children
- 至少在理論上。但是這裏有什麼實踐(JPA)?
請注意,僅僅在Hibernate和/或EclipseLink上進行嘗試並不能真正回答JPA 2規範或JPA兼容提供程序是否應支持此方案的問題。
更新2:
試穿休眠結果上述映射在下面的映射異常:
Caused by: org.hibernate.MappingException: Repeated column in mapping for collection: com.kawoolutions.bbstats.model.Group.parents column: parent_ordinal_nbr
at org.hibernate.mapping.Collection.checkColumnDuplication(Collection.java:340)
at org.hibernate.mapping.Collection.checkColumnDuplication(Collection.java:363)
at org.hibernate.mapping.Collection.validate(Collection.java:320)
at org.hibernate.mapping.IndexedCollection.validate(IndexedCollection.java:89)
at org.hibernate.cfg.Configuration.validate(Configuration.java:1291)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1729)
at org.hibernate.ejb.EntityManagerFactoryImpl.<init>(EntityManagerFactoryImpl.java:84)
at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:904)
... 9 more
卸下@OrderColumn
爲parent_ordinal_nbr
結果在相同的異常爲children
關係。看起來Hibernate不喜歡在外鍵中使用的命令列。
更新3:測試使用的EclipseLink在GlassFish
...這個工程,沒有映射例外。
這帶來兩個後續問題:
- 是否JPA禁止外鍵順序列?它沒有任何意義,爲什麼他們不應該簡單地工作...
- 這是一個Hibernate的bug?
無論實體的狀態表示...的後續問題是在這裏:http://stackoverflow.com/questions/10054400/jpa-ordercolumn-and-可見的實體狀態 – Kawu 2012-04-07 12:18:16
好的解釋。真正顯示OrderColumn和OrderBy之間的區別。 +1 – 2014-11-17 10:26:29