JBoss EAP においてトランザクション外のクエリで LazyInitializationException が発生する

Solution Unverified - Updated -

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

Subscriber exclusive content

A Red Hat subscription provides unlimited access to our knowledgebase of over 48,000 articles and solutions.

Current Customers and Partners

Log in for full access

Log In
Close

Welcome! Check out the Getting Started with Red Hat page for quick tours and guides for common tasks.