Hibernate映射一对多关系:父对孩子的FK的PK

时间:2012-07-12 12:59:09

标签: java hibernate hibernate-mapping

我有一个经典的一对多关系,在用Hibernate保存时,我无法将父PK列值传递给Child的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值传递给孩子的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对对象进行持久化。通过这种方式,我将重用JAXB生成的类与Hibernate,并且这些PK和FK元素在XML上不存在。这些是特定于数据库的。

1 个答案:

答案 0 :(得分:2)

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

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

policy.setHolding(obj);

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