【问题标题】:Hibernate @JoinColumn in both entities for 1-m relationship在两个实体中休眠 @JoinColumn 以实现 1-m 关系
【发布时间】:2012-12-10 08:28:47
【问题描述】:

假设 Department 和 Employee 之间存在 1-m 关系,哪个部门可以有很多员工,而一个员工只能在一个部门。我将 depId 作为 Employee 表中的外键。下面是实体与 setter 和 getter 的样子,

@Entity
public class Employee {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long empId;
    private String name;

    @ManyToOne
    @JoinColumn(name = "deptId")
    private Department dept;

    public Long getEmpId() {
        return empId;
    }
}



@Entity
public class Department {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long deptId;
    private String name;

    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    @JoinColumn(name = "deptId")
    @IndexColumn(name = "idx")
    private Set<Employee> listEmp;
}

之前的部门有属性 mappedBy,现在两个实体都有 joinColumn 两个实体都是关系的所有者,对吧?

我的疑问是当我首先创建部门然后创建一组员工并设置我创建的部门并保存部门对象时它工作正常。但后来我只是尝试创建一个部门并创建一个员工并将部门设置在那里并保存它给我的 Employee 对象下面的异常。

Hibernate:插入 Employee (deptId, name) 值 (?, ?) 异常 在线程“主”org.hibernate.TransientObjectException:对象 引用未保存的瞬态实例 - 保存瞬态实例 刷新前:hello.domain.Department

不应该是双向的吗?

【问题讨论】:

    标签: java hibernate


    【解决方案1】:

    之前的部门有属性 mappedBy,现在两个实体都有 joinColumn 两个实体都是关系的所有者,对吧?

    不对。现在,您有两个不同的单向关联,而不是 OneToMany 双向关联,Hibernate 尝试使用同一列进行映射,从而导致不可预测的行为。

    您应该在一侧使用mappedBy 属性。

    【讨论】:

      【解决方案2】:

      来自http://docs.jboss.org/hibernate/annotations/3.5/reference/en/html_single/:

      2.2.5.3.1.1。双向

      由于多对一(几乎)总是 JPA 规范中的双向关系,一对多 关联由 @OneToMany(mappedBy=...) 注释

      后面是例子,后面是:

      Troop 与 Soldier 具有双向的一对多关系 通过部队财产。您不必(不得)定义任何 mappedBy 端的物理映射。

      映射一个双向的一对多,以一对多的边作为 拥有方,您必须删除 mappedBy 元素并设置许多 将一个 @JoinColumn 设置为可插入并可更新为 false。

      请注意,始终只有一个“拥有”方。

      【讨论】:

      猜你喜欢
      • 2013-11-07
      • 1970-01-01
      • 1970-01-01
      • 2015-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-04
      • 1970-01-01
      相关资源
      最近更新 更多