我有一个经典的一对多关系,在用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上不存在。这些是特定于数据库的。
答案 0 :(得分:2)
您只是忘记初始化双向关联的拥有方。您只初始化了反面(具有mappedBy
属性的那一面)。 Hibernate只考虑拥有方知道是否存在关联(没有mappedBy
属性的一方)。
将此添加到您的代码中(保存保留之前):
policy.setHolding(obj);
旁注:如果您命名policy
字段(和访问者)policies
,则代码将更具可读性。它们很多,所以应该有复数形式。