Kaw*_*awu 11 many-to-many hibernate jpa eclipselink
我有一个实体映射如下:
@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;
...
}
Run Code Online (Sandbox Code Playgroud)
它有一个复合键,(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)
);
Run Code Online (Sandbox Code Playgroud)
我知道可以为拥有的实体映射@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;
Run Code Online (Sandbox Code Playgroud)
题:
对于自有方,是否也支持将@ManyToMany(mappedBy = ...)反向关系映射到a @OrderColumn?
@ManyToMany(mappedBy = "parents")
@OrderColumn(name = "parent_ordinal_nbr")
private List<Group> parents;
Run Code Online (Sandbox Code Playgroud)
JPA 2规范是否定义允许或拒绝这个?
谢谢
更新1:
以上基本上是图形结构.这是一个例子:

该GroupLinks表包含盒装实体.Group仅查看B2 实体时,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:
在Hibernate上尝试上述映射会导致以下映射异常:
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
Run Code Online (Sandbox Code Playgroud)
删除@OrderColumnfor会parent_ordinal_nbr导致children关系出现相同的异常.看起来Hibernate不喜欢在外键中使用的order列.
更新3:
在GlassFish上使用EclipseLink进行测试......这样做,没有映射异常.
这提出了两个后续问题:
该javadoc的或OrderColumn有你要找的信息:
OrderColumn注释在关系的一侧指定,该注释引用要订购的集合.订单列在实体或可嵌入类的状态中不可见.
OrderBy注释应该用于作为持久状态可见并由应用程序维护的排序.指定OrderColumn时,不使用OrderBy注释.
OrderColumn用于向连接表添加其他列,用于维护列表的顺序.如javadoc中所述,order列不是实体状态的一部分.在您的情况下,您似乎希望通过其持久属性之一对列表中的元素进行排序.在这种情况下,您必须使用OrderBy注释(或者在返回之前使用对列表进行排序的getter).
| 归档时间: |
|
| 查看次数: |
9604 次 |
| 最近记录: |