Hibernate,如何映射父表中由序列生成的外键?

4

我在数据库中有一个1:n的关系,用Hibernate表示关系的Java对象。 父表的主键是使用数据库序列生成的,子对象使用父对象的主键作为外键。

我创建了一个包含一组新子对象的新父对象。然后我尝试使用一个单一的操作将所有对象持久化。

session.save(contract);

父对象的存储没有问题,但是一旦我添加子对象,就会出现异常。

...非空属性引用了空值或暂时值...

这是由于子对象中缺少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;
    }

...

1个回答

1
有没有一种映射方式可以告诉Hibernate在子对象中使用新生成的父对象PK作为FK,还是我必须手动设置FK并单独持久化子对象?
实际上没有特定的映射方式。但是,我怀疑您在构建双向关联时没有正确设置“链接的两个方向”。您需要像这样做:
Contract contract = new Contract();
...
ContractSearchtags tag = new ContractSearchtags();
...
contract.getContractSearchtagses().add(tag);
tag.setContract(contract);

session.save(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);

资源


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接