0

Employee と Roles の 2 つのクラスがあります。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;
}

しかし、従業員をフェッチして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=?
4

2 に答える 2

1

LAZY fetch 型から getter を呼び出すメソッドに @Transactional アノテーションを追加します。例えば:

@Transactional(readOnly = false, propagation = Propagation.REQUIRED)
public void doSomething(){
  ...
  Iterator<Roles> itr=ec.getRolesList().iterator();
  ...
}
于 2014-11-10T10:09:38.663 に答える
0

両側に cascade={CascadeType.ALL} があります。ロール側でカスケードを削除してみてください。

于 2015-07-10T19:37:25.523 に答える