2016-04-28 46 views
1

我有非常簡單的實體對象User與用戶角色有關係。什麼讓我煩惱是,當我從數據庫中獲取用戶對象,並將其傳遞給另一個想訪問該用戶對象中的用戶角色的方法時,我遇到了着名的無法初始化代理休眠異常。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>,但這種接縫像正常的事情一樣,並沒有看到有必要打開這個選項。

編輯:代碼例如:

Getter和用戶類的設置器

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

的UserRole

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

方法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

也許發佈您的實體,以及您如何調用取回? – olexity

+0

我提供了代碼示例(大部分),tnx – hyperion385

回答

2

所以基本上經過大量的谷歌搜索和閱讀有關會話我的假設是正確的。實體對象幾乎與原始會話「綁定」,在這些會話中,這些對象不能以這種方式執行。一種解決方案是將實體綁定到新的會話上,調用session.update(實體),並且這個新的會話知道實體。基本上新的查詢被髮布來再次填充實體字段。因此,如果不是必要,請避免此操作,並嘗試在原始會話中獲取所有需要的數據。

更多閱讀:Could not initialize proxy - no Session