gpt4 book ai didi

hibernate - JPA 是否支持 @ManyToMany(mappedBy = ... ) + @OrderColumn?

转载 作者:行者123 更新时间:2023-12-04 02:15:45 31 4
gpt4 key购买 nike

我有一个实体映射如下:

@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:

以上本质上是一个图结构。下面是一个例子:

IMAGE
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应该可以正常工作 双方关系 parentschildren - 至少在理论上。但是这里的做法(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

删除 @OrderColumnparent_ordinal_nbr导致 children 的相同异常关系。看起来 Hibernate 不喜欢也在外键中使用的订单列。

更新 3:

在 GlassFish 上使用 EclipseLink 进行测试......这有效,没有映射异常。

这提出了两个后续问题:
  • JPA 是否禁止外键顺序列? 我不明白为什么它们不应该简单地工作...
  • 这是 hibernate 错误吗?
  • 最佳答案

    javadoc or OrderColumn有您要找的信息:

    The OrderColumn annotation is specified on the side of the relationship that references the collection that is to be ordered. The order column is not visible as part of the state of the entity or embeddable class.

    The OrderBy annotation should be used for ordering that is visible as persistent state and maintained by the application. The OrderBy annotation is not used when OrderColumn is specified.



    OrderColumn 用于向连接表添加额外的列,用于维护列表的顺序。在 javadoc 中提到的 order 列不是实体状态的一部分。在您的情况下,您似乎想通过其持久属性之一对列表中的元素进行排序。在这种情况下,您必须使用 OrderBy 注释(或者在返回列表之前使用 getter 对列表进行排序)。

    关于hibernate - JPA 是否支持 @ManyToMany(mappedBy = ... ) + @OrderColumn?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9957247/

    31 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com