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

时间:2010-09-23 15:05:39

标签: hibernate mapping foreign-keys sequence

我在数据库和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;
    }

...

1 个答案:

答案 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);

资源