Hibernate LAZY抓取问题

时间:2013-06-24 07:52:56

标签: hibernate lazy-loading

我有两个类Employee和Roles.Employee有很多角色,每个角色都有很多Employees。 因此我通过使用另一个表'EMPLOYEE_ROLES'来使用ManyToMany关系。

在员工类中:

@ManyToMany(fetch = FetchType.LAZY,cascade={CascadeType.ALL})
@JoinTable(name="EMPLOYEE_ROLES",joinColumns=     {@JoinColumn(name="EC",nullable=false,updatable=false)},inverseJoinColumns={@JoinColumn(name = "ROLE_ID", 
        nullable = false, updatable = false) }) 
public Set<Roles> getRolesList() {
    return rolesList;
}

在角色课程中:

  @ManyToMany(fetch = FetchType.LAZY,cascade={CascadeType.ALL},mappedBy="rolesList")
public Set<Employee> getEmployees() {
    return employees;
}

但是当我获取Employee并访问roleList时,角色被完美加载,但同时获取了在EMPLOYEE_ROLES表上触发的删除查询。

 Employee ec=employeeService.findByEmployeeCode(121);
 Iterator<Roles> itr=ec.getRolesList().iterator();

请有人建议我。如果我使用fetchType.EAGER它可以很好地工作,但是当我使用LAZY时,只会出现这个问题:

 Hibernate: select roleslist0_.EC as EC11_1_, roleslist0_.ROLE_ID as ROLE2_41_1_, roles1_.ID as ID8_0_, roles1_.DESCRIPTION as DESCRIPT2_8_0_, roles1_.ROLES as ROLES8_0_ from EMPLOYEE_ROLES roleslist0_ inner join ENABLE.ROLES roles1_ on roleslist0_.ROLE_ID=roles1_.ID where roleslist0_.EC=?
 Hibernate: delete from EMPLOYEE_ROLES where EC=?

2 个答案:

答案 0 :(得分:1)

在您从LAZY获取类型调用getter的方法上添加@Transactional注释。例如:

@Transactional(readOnly = false, propagation = Propagation.REQUIRED)
public void doSomething(){
  ...
  Iterator<Roles> itr=ec.getRolesList().iterator();
  ...
}

答案 1 :(得分:0)

你的两边都有cascade = {CascadeType.ALL},尝试删除角色端的级联。