2013-06-24 91 views
0

我有兩個類Employee和Roles.Employee有很多角色,每個角色都有很多Employees。 這樣我就可以通過另一個表「EMPLOYEE_ROLES」使用ManyToMany關係。Hibernate LAZY抓取問題

在Employee類:

@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; 
} 

但是,當我取回員工和訪問的RoleList,角色完美,但隨着獲取刪除加載在EMPLOYEE_ROLES表上觸發查詢。

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

請任何人都可以給我推薦。如果我使用fetchType.EAGER它完美的作品,但是當我使用懶惰,那麼只有這個問題就來了:

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=? 
+0

歡迎使用stackoverflow!它有點不清楚你的問題是什麼:'ec.getRolesList()。iterator()'導致'delete'命令?我只看到這個集合的更新,通常後面有幾個'INSERT'語句來恢復集合的元素。你確定在獲得迭代器後不會沖洗上下文嗎? – mabi

+0

不,這個東西是每當我對roleList做任何操作的時候,我都會因爲LAZY而完全從數據庫加載數據。但是爲什麼第二個查詢會被解僱呢? – tsk

+0

第二個查詢可能是由代碼的其他部分觸發的。您使用的是何種Hibernate版本,您確定獲得角色是執行刪除的地方嗎? –

回答

1

添加@Transactional註解的方法,其中從LAZY叫干將獲取類型。例如:

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

您在兩側都有cascade = {CascadeType.ALL},請嘗試刪除角色端的級聯。