在同一对象上休眠一对一关系

时间:2012-07-16 13:11:22

标签: 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;
    }

}

这是一个代码示例,这样您就可以理解我的目标......如何设置这种关系?

2 个答案:

答案 0 :(得分:3)

由于

,它不起作用
mappedBy="transaction" 

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

如果您希望从子级到父级的单向一对一,则可以使用以下方法:

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;
}

答案 1 :(得分:0)

假设您有一个外键列" derived_id"在您的交易表中,您可以指定加入列

 @Entity
 public class Transaction 
 {
    @OneToOne
    @JoinColumn(name = "derived_id", nullable = true)
    private Transaction derivedFrom;
 }