两个实体中的Hibernate @JoinColumn为1-m关系

时间:2012-12-23 16:13:24

标签: java hibernate

假设部门和员工之间存在1米的关系,哪个部门可以有多个员工,一个员工只能在一个部门。我将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;
}

Ealier Department有属性mappedBy,现在两个实体都有joinColumn,两个实体都是关系的所有者吗?

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

  

Hibernate:插入Employee(deptId,name)值(?,?)异常   in thread&#34; main&#34; org.hibernate.TransientObjectException:object   引用未保存的瞬态实例 - 保存瞬态实例   在刷新之前:hello.domain.Department

它不应该双向工作吗?

2 个答案:

答案 0 :(得分:4)

  

Ealier Department有属性mappedBy,现在两个实体都有joinColumn,两个实体都是关系的所有者吗?

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

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

答案 1 :(得分:0)

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

  

2.2.5.3.1.1。双向

     

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

注释

接下来是一个例子,接着是:

  

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

     

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

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