gpt4 book ai didi

java - Hibernate 中作为复合标识符的组件

转载 作者:行者123 更新时间:2023-11-30 03:46:04 25 4
gpt4 key购买 nike

我正在关注Hibernate Documentation并尝试实现 9.4 节给出的示例。组件作为复合标识符,但面临如何实现它的问题。

这是我所做的:

我的实体类:

订单.java

public class Order {
private int id;
private Set<OrderLine> lines = new HashSet<OrderLine>();
// Setters & Getters
}

OrderLine.java

public class OrderLine {
private OrderLineId id;
private String name;
private Order order;
// Setters & Getters
}

OrderLineId.java

public class OrderLineId implements Serializable{
private int lineId;
private int orderId;
private int customerId;
// Setters & Getters
}

我的映射文件有问题:

<hibernate-mapping>
<class name="Order" table="TEST_Order">
<id name="id" type="int" column="id">
<generator class="native"/>
</id>
<set name="lines" cascade="all">
<key column="orderId"/>
<one-to-many class="OrderLine"/>
</set>
</class>

<class name="OrderLine" table="TEST_OrderLine">
<composite-id name="id" class="OrderLineId">
<key-property name="lineId"/>
<key-property name="orderId"/>
<key-property name="customerId"/>
</composite-id>

<property name="name"/>

<many-to-one name="order" class="Order"
insert="false" update="false">
<column name="orderId"/>
<column name="customerId"/>
</many-to-one>
</class>
</hibernate-mapping>

当我尝试创建一个解析此映射文件的 session 工厂时,我收到一个异常:

Caused by: org.hibernate.MappingException: Foreign key (FK_89b4nqt5l2n6tfd1d5tq0ill0:TEST_OrderLine [orderId,customerId])) must have same number of columns as the referenced primary key (TEST_Order [id])
at org.hibernate.mapping.ForeignKey.alignColumns(ForeignKey.java:110)
at org.hibernate.mapping.ForeignKey.alignColumns(ForeignKey.java:93)
at org.hibernate.cfg.Configuration.secondPassCompileForeignKeys(Configuration.java:1816)
at org.hibernate.cfg.Configuration.originalSecondPassCompile(Configuration.java:1739)
at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1424)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1844)

有人可以帮助我如何实现文档中给出的示例吗?

最佳答案

OrderLine需要引用Order PK,它不是复合键。

这意味着多对一必须是:

<many-to-one name="order" class="Order"
insert="false" update="false">
<column name="orderId"/>
</many-to-one>

orderId 是 Order.id 的 FK。

那么一对多的一方就会变成:

<set name="lines" cascade="all">
<key>
<column name="orderId"/>
</key>
<one-to-many class="OrderLine"/>
</set>

因此,即使 OrderLine 有复合键,引用也是在 Order.id 之后进行的,这是一个简单键。

如果您想将其他关联映射到 OrderLine,例如 OrderLineProduct,那么您需要使用复合键来映射父项 (OrderLine) 和子项 (OrderLineProduct) 之间的关联,以便 OrderLineProduct 具有复合键 -外键返回 OrderLine。

关于java - Hibernate 中作为复合标识符的组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25664452/

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