【问题标题】:Hibernate, mapping of foreign keys that have been generated by a sequence in the parent tableHibernate,父表中已经生成的外键的映射
【发布时间】:2011-04-16 08:05:02
【问题描述】:

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

我创建了一个新的父对象,包括一组新的子对象。 然后我尝试用 one single

持久化所有对象
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;
    }

...

【问题讨论】:

    标签: hibernate mapping foreign-keys sequence


    【解决方案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);
    

    资源

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-05
      • 1970-01-01
      • 2011-01-17
      • 2015-07-28
      • 2011-02-14
      • 1970-01-01
      • 2011-03-20
      • 2015-08-24
      相关资源
      最近更新 更多