我在数据库和java对象中有1:n关系,表示与hibernate的关系。 使用数据库序列生成父表的主键, 子对象使用父对象的主键作为外键。
我创建了一个包含一组新子对象的新父对象。 然后我尝试使用一个
来保留所有对象session.save(contract);
父对象的存储没有问题,但是一旦我添加子对象,我就会得到一个异常
... not-null属性引用空值或瞬态值...
因为子对象中缺少FK。
是否有一个映射告诉hibernate在子对象中使用新生成的父对象PK作为FK,或者我是否必须使用手动设置的FK单独保留子对象?
映射父对象: ...
@Id
@Column(name="ID", unique=true, nullable=false, precision=22, scale=0)
@SequenceGenerator(name="sequence_seq", sequenceName="SEQ_CONTRACT")
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequence_seq")
public long getId() {
return this.id;
}
...
@OneToMany(cascade=CascadeType.ALL, fetch=FetchType.LAZY, mappedBy="contract")
public Set<ContractSearchtags> getContractSearchtagses() {
return this.contractSearchtagses;
}
...
子对象的映射
...
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="CONTRACT_ID", nullable=false)
public Contract getContract() {
return this.contract;
}
...
答案 0 :(得分:1)
是否有一个映射告诉hibernate在子对象中使用新生成的父对象PK作为FK,或者我是否必须使用手动设置的FK单独保留子对象?
没有用于此的特定映射。但是,我怀疑在构建双向关联时,您没有正确设置“链接的两端”。你需要做这样的事情:
Contract contract = new Contract();
...
ContractSearchtags tag = new ContractSearchtags();
...
contract.getContractSearchtagses().add(tag);
tag.setContract(contract);
session.save(contract);
开发人员通常使用“链接管理方法”来正确设置双方(在Contract
中):
public void addToContractSearchtagses(ContractSearchtags tag) {
contractSearchtagses.add(tag);
tag.setContract(this);
}
然后代码变为:
Contract contract = new Contract();
...
ContractSearchtags tag = new ContractSearchtags();
...
contract.addToContractSearchtagses(tag);
session.save(contract);