休眠映射一对多关系:父母对孩子的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中。这些是特定于数据库的。
你只是忘了初始化双向关联的拥有方。您只初始化反面(具有mappedBy
属性的面)。 Hibernate只考虑拥有方知道是否存在关联(没有mappedBy
属性的那一面)。
添加到您的代码(保存在举行前):
policy.setHolding(obj);
旁注:你的代码将更具可读性,如果你命名policy
场(和存取)policies
。它们中有很多,所以它应该有一个复数形式。
@你说的没错。这是我缺少获取完美对象模型的部分,但JAXB不知道它。如何解决这个问题? – 2012-07-12 15:20:31
您可以在实体的afterunmarshall调用者中设置父级。请参阅https://jaxb.java.net/guide/Mapping_cyclic_references_to_XML.html – user993553 2015-09-21 05:28:06
您应该添加更多关于如何在em.persist()之前构建对象实例的信息。 Hibernate应该处理所有这些。 – nomoa 2012-07-12 13:10:29
你如何坚持父母/孩子?我认为使用mappedBy相当于Hibernate中的inverse = true - 意味着Child是关系的“所有者”,因此您必须坚持孩子们正确设置FK。 – jeff 2012-07-12 13:12:40
@nomoa我添加了测试代码。这里所有其他的子列值都传递完美,只是FK列正在填充Parent的PK。 – 2012-07-12 13:24:36