java - Hibernate映射一对多关系:Parent's PK to Child's FK

标签 java hibernate hibernate-mapping

我有一个经典的一对多关系,在使用 Hibernate 保存它时,我无法将父级的 PK 列值传递给子级的 FK 列。
父类

@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private int holdingPK;

@OneToMany(mappedBy="holding",targetEntity=PolicyType.class,fetch=FetchType.LAZY, cascade = CascadeType.ALL)
@XmlElement(name = "Policy")
private Set<PolicyType> policy;

子类

@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private int policyPK;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name="HoldingFK",nullable = false)
private HoldingType holding;

这里HoldingPK是一个自动生成的序列列,代表主键。当我插入保持行时会生成值。因此,我想将 HoldingPK 值动态传递给 child 的 HoldingFK 列。
测试代码

HoldingType obj = new HoldingType();
obj.setCurrencyTypeCode("6");
obj.setHoldingKey("123");
Set<PolicyType> set = new TreeSet<PolicyType>();
PolicyType policy = new PolicyType();
policy.setJurisdiction("Haha");
set.add(policy);
obj.setPolicy(set);
session.save(obj);
transaction.commit();

因此,我可以将 Child 的其他值传递给 Child Table 列,只是 Parent PK 未到达 Child 的 FK 列。

这里我将 XML 文档值保存到数据库中。为此,我使用 JAXB 将 XML 编码为 Java 对象,然后使用 Hibernate 持久保存对象。通过这种方式,我可以通过 Hibernate 重用 JAXB 生成的类,并且这些 PK 和 FK 元素在 XML 上不存在。这些是特定于数据库的。

最佳答案

您只是忘记初始化双向关联的拥有方。您只初始化了反面(具有 mappedBy 属性的一侧)。 Hibernate 仅考虑拥有方来了解关联是否存在(没有 mappedBy 属性的一方)。

将此添加到您的代码中(在保存馆藏之前):

policy.setHolding(obj);

旁注:如果您将 policy 字段(和访问器)命名为 policies,您的代码将更具可读性。它们有很多,所以应该有复数形式。

关于java - Hibernate映射一对多关系:Parent's PK to Child's FK ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11452388/

相关文章:

java - 如何使用 Hibernate 在 Oracle 中保留 LARGE BLOB (>100MB)

java - 如何在 Hibernate 中使用 DAO 方法从数据库中检索、更新、删除数据

java - session.get() 在 hibernate 状态下返回 null

java - 使用 N :1 relationship 将同一列保存在 JPA secondaryTable 中

java从文件中读取int,原始方法不起作用寻找新的东西

java - 我如何确定 JDialog 是否有 child ?

java - 谁真正实现了可序列化的方法?

java - 从names.nsf目录中检索拒绝访问组成员

java - 使用 Hibernate 将具有相同 ID 的结果集的行分配到 Java 列表中

java - 使用 POJO 和 hbm.xml 生成 DAO