Hibernate 对同一对象的一对一关系

标签 hibernate hibernate-mapping hibernate-annotations

我有一个交易表,其中包含有关...交易的信息,某些交易是从先前的交易派生的,因此交易之间可以存在一对一的关系。

我正在尝试在 hibernate 中设置注释来创建此数据结构,但我无法弄清楚或找到如何做到这一点。

@Entity
@Table(name="transaction")
public class Transaction {
private String transactionid;
private Transaction derivedFrom;

   /**
     * @return the transactionid
     */
    @Id
    public String getTransactionid() {
        return transactionid;
    }
    /**
     * @param transactionid the transactionid to set
     */
    public void setTransactionid(String transactionid) {
        this.transactionid = transactionid;
    }

    @OneToOne(mappedBy = "transaction", cascade = CascadeType.ALL)
    public Transaction getDerivedFrom() {
        return derivedFrom;
    }
    public void setDerivedFrom(Transaction derivedFrom) {
        this.derivedFrom = derivedFrom;
    }

}

这是一个代码示例,以便您了解我的意图...关于如何建立这种关系有什么想法吗?

最佳答案

它不起作用,因为

mappedBy="transaction" 

在关系的另一端调用双向关系和属性名称事务。正如您从代码中看到的,您没有这样的属性。

如果您想要从 child 到 parent 的单向一对一,可以采用以下方法:

public class Transaction {
    private String transactionid;
    private Transaction parent;

    @Id
    public String getTransactionid() {
        return transactionid;
    }
    public void setTransactionid(String transactionid) {
        this.transactionid = transactionid;
    }
    @OneToOne
    public Transaction getParent() {
        return parent;
    }
    public void setParent(Transaction parent) {
        this.parent = parent;
    }
}

关系默认保存到列名parent_transactionid,这当然可以通过 @JoinColum 进行更改。此外,您可能希望为列设置唯一的约束。

要使上述关系成为双向一对一,只需添加以下内容(无需其他修改):

private Transaction child;

@OneToOne(mappedBy = "parent")
public Transaction getChild() {
    return parent;
}
public void setChild(Transaction child) {
    this.child = child;
}

关于Hibernate 对同一对象的一对一关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11505063/

相关文章:

mysql - grails/gorm/mysql/hibernate

hibernate - Hibernate 中的托管 vs jta session 范围

mysql - "org.hibernate.ObjectNotFoundException: No row with the given identifier exists"但它确实存在

java - 同一个tomcat实例中的多个webapp如何共享数据库连接池?

java - Hibernate一对一处理两列(实体类中相同类型的两个字段)

java - Hibernate:使用连接表进行双向多对一映射的持久实体 - org.hibernate.PropertyValueException

java - 通过父实体更新删除添加子实体列表

java - HiLo 生成器策略不起作用

java - JPA 对两个 OneToMany 实体使用一个联接表

java - 每个实体 hibernate 两个表