我有一个经典的一对多关系,在使用 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/