1

假设 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 两个实体都是关系的所有者,对吧?

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

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

它不应该双向工作吗?

4

2 回答 2

4

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

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

您应该使用mappedBy一方面的属性。

于 2012-12-23T16:19:22.850 回答
0

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

2.2.5.3.1.1。双向

由于多对一(几乎)始终是 JPA 规范中双向关系的所有者,因此一对多关联由 @OneToMany(mappedBy=...)

后面是一个例子,后面是:

部队通过部队属性与士兵具有双向的一对多关系。您不必(不得)在 mappedBy 端定义任何物理映射。

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

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

于 2012-12-23T16:22:54.293 回答