【发布时间】:2018-09-13 11:50:38
【问题描述】:
我有两个实体部门和员工。部门有一份员工名单。并且 Employee 有一个外勤部门。我可以创建员工并将他们添加到部门内的列表中。数据库表在持久化时按预期填充。如果我查询部门,我会得到部门并且员工列表已填写。这种方式一切都很好。如果我查询 Employee 并获取 Department 字段,则返回 null。
@Entity
@Table(name = "DEPARTMENT")
public class Department {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "DPT_ID")
private long id;
@Column(name = "NAME", nullable = false, unique = true)
private String name;
@OneToMany(cascade = CascadeType.ALL)
@JoinColumn(name = "DEPARTMENT") //we need to duplicate the physical information
private List<Employee> employees = new ArrayList<>();
…
--
@Entity
@Table(name = "EMPLOYEE")
public class Employee {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "EMP_ID")
private long id;
@Column(name = "NAME", nullable = false)
private String name;
@Column(name = "DESIGNATION")
private String designation;
@ManyToOne
@JoinColumn(name = "DEPARTMENT", insertable = false, updatable = false)
private Department department;
...
--
employee.getDepartment() 返回 null 的查询
session = HibernateUtil.getSessionFactory().openSession();
transaction = session.getTransaction();
transaction.begin();
Department department = new Department();
department.setName("IT Department");
Employee employee1 = new Employee();
employee1.setName("Adam");
employee1.setDesignation("Manager");
Employee employee2 = new Employee();
employee2.setName("Miller");
employee2.setDesignation("Software Engineer");
Employee employee3 = new Employee();
employee3.setName("Smith");
employee3.setDesignation("Associate Engineer");
department.getEmployees().add(employee1);
department.getEmployees().add(employee2);
department.getEmployees().add(employee3);
session.persist(department);
session.flush();
transaction.commit();
transaction = session.getTransaction();
transaction.begin();
{
CriteriaBuilder builder = session.getCriteriaBuilder();
CriteriaQuery<Employee> query = builder.createQuery(Employee.class);
Root<Employee> root = query.from(Employee.class);
query.select(root);
Query<Employee> q = session.createQuery(query);
List<Employee> employees = q.getResultList();
for (Employee employee : employees) {
System.out.println("EMPLOYEE NAME: " + employee.getName());
System.out.println("DEPARTMENT NAME: " + employee.getDepartment()); // gives null
}
}
{
CriteriaBuilder builder = session.getCriteriaBuilder();
CriteriaQuery<Department> query = builder.createQuery(Department.class);
Root<Department> root = query.from(Department.class);
query.select(root);
Query<Department> q = session.createQuery(query);
List<Department> departments = q.getResultList();
for (Department deps : departments) {
System.out.println(deps.getName());
System.out.println(deps.getEmployees()); // list of employees is filled
}
}
表格似乎填写正确。但是,如果我在查询的员工上使用 getDepartment,我会得到空值。如果我在查询的部门上使用 getEmployees,我会得到所有员工。
我尝试了这里描述的两种方法:https://docs.jboss.org/hibernate/orm/4.1/manual/en-US/html/ch07.html#collections-bidirectional
示例 7.21。双向一对多,多对一作为关联所有者
和
示例 7.22。以一对多作为所有者的双向关联
对我来说同样的结果。
我错过了什么?
这里是完整的测试项目:updated Project zip
已解决的固定项目:SOLVED PROBLEM PROJECT
【问题讨论】:
-
你应该在关系的子端使用
mappedBy(不持有FK的那个)
标签: java hibernate one-to-many