休眠映射一对多关系:父母对孩子的FK的PK

问题描述:

我有一个经典的一对多关系,并用Hibernate保存时,我无法将父母的PK列值传递给孩子的FK列。
父类休眠映射一对多关系:父母对孩子的FK的PK

@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是表示主键的自动生成的序列列。当我插入一个Hold行时,会生成值。所以我想将HoldPK值传递给儿童的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(); 

所以我能够对孩子的其他值传递到子表列,只是家长PK没有达到对孩子的FK列。

这里我将XML文档值保存到数据库中。为此,我使用JAXB将XML编组为XML对象,然后使用Hibernate持久化对象。这样我就可以重用JAXB生成的类与Hibernate,并且这些PK和FK元素不存在于XML中。这些是特定于数据库的。

+0

您应该添加更多关于如何在em.persist()之前构建对象实例的信息。 Hibernate应该处理所有这些。 – nomoa 2012-07-12 13:10:29

+0

你如何坚持父母/孩子?我认为使用mappedBy相当于Hibernate中的inverse = true - 意味着Child是关系的“所有者”,因此您必须坚持孩子们正确设置FK。 – jeff 2012-07-12 13:12:40

+0

@nomoa我添加了测试代码。这里所有其他的子列值都传递完美,只是FK列正在填充Parent的PK。 – 2012-07-12 13:24:36

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

添加到您的代码(保存在举行前):

policy.setHolding(obj); 

旁注:你的代码将更具可读性,如果你命名policy场(和存取)policies。它们中有很多,所以它应该有一个复数形式。

+0

@你说的没错。这是我缺少获取完美对象模型的部分,但JAXB不知道它。如何解决这个问题? – 2012-07-12 15:20:31

+0

您可以在实体的afterunmarshall调用者中设置父级。请参阅https://jaxb.java.net/guide/Mapping_cyclic_references_to_XML.html – user993553 2015-09-21 05:28:06