JBoss EAP においてトランザクション外のクエリで LazyInitializationException が発生する
Issue
エンティティオブジェクトの中に別のオブジェクトがあり、さらにその中に別のオブジェクトがあるエンティティオブジェクトを取得する時に、begin および commit トランザクションを使用する必要があります。
この begin および commit は JBOSS のコミュニティエディションでは必要ありませんでした。これは、JBOSS EAP バージョンでのみ必要になります。
すべてのデータベースアクセスコードは、BEAN 管理トランザクションを使用した EJB 3.1 コンポーネントに含まれます。“@TransactionManagement(TransactionManagementType.BEAN)”
以下は、コードの抜粋になります。
public List<User> getUsers(List<SearchCriteria> criteria, RequestOptions options)
throws ServiceException
{
List<User> users = null;
try{
//begin();
Query query = em.createQuery("select user from test.entity.User as user");
List<?> resultset = query.getResultList();
User user = (User) resultset.get(0);
user.getRoles().size();
//commit();
} catch(Exception ex){
rollback();
}
return users;
}
begin または commit トランザクションを使用しない場合は、"user.getRoles()" をする際に "LazyInitializationException" が発生します。
Caused by: org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.test.entity.User.roles, could not initialize proxy - no Session
Environment
- Red Hat JBoss Enterprise Application Platform (EAP)
- 6
- Hibernate 4
- 5
- Hibernate 3
- 6
Subscriber exclusive content
A Red Hat subscription provides unlimited access to our knowledgebase, tools, and much more.