【问题标题】:how to add @onetoone mapping for self entity in hibernate如何在休眠中为自身实体添加@onetoone映射
【发布时间】:2013-08-28 11:50:16
【问题描述】:

如何为 self 实体添加一对一映射。就像在这个例子中一样。我想为 Person 本身建立父子关系。

@Entity
@Table(name="PERSON")
public class Person {

@Id
@Column(name="personId")
private int id;

@OneToOne
@JoinColumn()
private Person parentPerson;
}

【问题讨论】:

  • 你已经做到了。怎么了?
  • @PauliusMatulionis 是的,我做到了,顺便说一句,我查看了我的后端 mysql 表模式。新字段已创建为“parentPerson_id”,我如何从我的服务方法中添加它。

标签: spring hibernate hibernate-mapping hibernate-annotations


【解决方案1】:

这是双向自映射@OneToOne 的示例(我将列名更改为 SQL 表示法):

@Entity
@Table(name="PERSON")
public class Person {

    @Id
    @Column(name="person_id")
    private int id;

    @OneToOne
    @JoinColumn(name = "parent_person_id")
    private Person parentPerson;

    @OneToOne(mappedBy = "parentPerson")
    private Person childPerson;
}

但是,我不明白你为什么要在这种情况下使用@OneToOne

【讨论】:

  • 实际上任何人都只能有一个父母。我想与自引用实体建立父子关系。
【解决方案2】:

我是这样使用它的:

@OneToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
@JoinColumn(name = "PARENT_ID", nullable = true)
private Person parent;

为了从您的服务层添加父级,您需要在数据库中至少有一个Person

假设你这样做。然后创建一个新人。例如:

@Transactional
public void createPerson() {
   Person parent = //get your parent
   Person child = new Person();
   if (parent != null) {
       child.setParent(parent);
   }
}

如果这就是你的意思..

【讨论】:

  • 无需指定 fetch = FetchType.EAGER,因为 OneToOne 的默认值已经是 EAGER
猜你喜欢
  • 2014-12-27
  • 2014-03-12
  • 1970-01-01
  • 2015-10-31
  • 2019-12-03
  • 2020-12-18
  • 2014-11-19
  • 1970-01-01
相关资源
最近更新 更多