2

我有一个经典的一对多关系,在使用 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是一个自动生成的表示主键的序列列。当我插入一个 Holding 行时会生成值。所以我想动态地将 HoldingPK 值传递给孩子的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 上不存在。这些是特定于数据库的。

4

1 回答 1

2

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

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

policy.setHolding(obj);

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

于 2012-07-12T13:57:07.110 回答