我有非常簡單的實體對象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();
}
}
}
}
也許發佈您的實體,以及您如何調用取回? – olexity
我提供了代碼示例(大部分),tnx – hyperion385