2016-04-28 2 views
1

私は非常に単純なエンティティオブジェクトを持っています。私が悩んでいるのは、DBからUserオブジェクトを取得し、そのユーザーオブジェクト内のユーザー役割にアクセスしたい別のメソッドに渡すときです。有名なものを取得しています。プロキシのHibernate Exceptionを初期化できませんでした。Hibernateは別のセッションでオブジェクトを初期化します

Ex。方法1:

- open session, open transaction 
- fetch user 
- close transaction, close session 

今、私はこれを推測している2

- open session, open transaction 
- do Hibernate.initialize(user.getUserRole()) --> here it breaks 
- close transaction, close session 

方法に、そのユーザオブジェクトを渡すには、あなたが新しいセッションにオブジェクトを初期化することはできませんが、私は、なぜ分からない、いくつかの休止状態機能です。これには何か解決策はありますか?

PS。私は<property name="hibernate.enable_lazy_load_no_trans">true</property>について読んだことがありますが、この縫い目は普通のことのようであり、このオプションをオンにする必要はありません。

EDIT:コード例:

ゲッタとユーザクラスのセッターUserRoles

private Integer id; 
private String description; 
private Character active; 
private Set userses = new HashSet(0); 

@ManyToOne(fetch = FetchType.LAZY, targetEntity = UserRoles.class) 
@JoinColumn(name = "USER_ROLE_ID", nullable = false) 
public UserRoles getUserRoles() { 
    return this.userRoles; 
} 

public void setUserRoles(UserRoles userRoles) { 
    this.userRoles = userRoles; 
} 

フィールド方法1

public static void method1() { 
    Users user = null; 
    Session session = HibernateUtil.getSessionFactory().openSession(); 
    Transaction tx = null; 
    try { 
     tx = session.beginTransaction(); 
     String hqlQuery = "FROM Users WHERE userName = :userName"; 
     Query query = session.createQuery(hqlQuery); 
     query.setParameter("userName", userName); 
     List<Users> list = query.list();  
     for (Users u : list) { 
      user = u; 
      break; 
     } 
     tx.commit(); 
    } catch (HibernateException e) { 
     if (tx != null) 
      tx.rollback(); 
     Logging.handleExceptionLogging(e); 
    } finally { 
     session.close(); 
    } 

    method2(user); 
} 

方法だから、基本的に2

public static method2(Users user) { 

if (user != null) { 

     if (Hibernate.isInitialized(user.getUserRoles())) { 
      if (user.getUserRoles().getDescription() != null && user.getUserRoles().getDescription().toLowerCase().equals("admin")) 
       returnValue = true; 
     } else { 
      Session session = HibernateUtil.getSessionFactory().openSession(); 
      Transaction tx = null; 
      try { 
       tx = session.beginTransaction(); 
       Hibernate.initialize(user.getUserRoles()); // this line causes Exception 
       if (user.getUserRoles().getDescription().toLowerCase().equals("admin")) 
        returnValue = true; 
       tx.commit(); 
      } catch (HibernateException e) { 
       if (tx != null) 
        tx.rollback(); 
       Logging.handleExceptionLogging(e); 
      } finally { 
       session.close(); 
      } 
     } 
    } 
} 
+0

たぶんあなたのエンティティを投稿し、uはフェッチするために呼び出す方法? – olexity

+0

私はコード例(ほとんどの部分)、tnx – hyperion385

答えて

2

Google検索の多くの後、私の仮定が正しかったセッションについて読んで。エンティティオブジェクトはフェッチされた元のセッションにかなり拘束されており、このようなクエリはこのように実行できません。 1つの解決策は、新しいセッションがsession.update(エンティティ)を呼び出すことにエンティティをバインドすることであり、この新しいセッションよりもエンティティを知ることです。基本的に、エンティティフィールドを再び投入するための新しいクエリが発行されます。したがって、必要でない場合はこれを避け、元のセッションで必要なすべてのデータを取得しようとします。

続きを読む:Could not initialize proxy - no Session

関連する問題