假设部门和员工之间存在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
它不应该双向工作吗?
答案 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。
请注意,始终只有一个“拥有”方。