Kye*_*JmD 12 java persistence hibernate lazy-evaluation lazy-initialization
我的代码检索与用户相关的所有信息:
SessionFactory sessionFactory = HibernateUtilities.configureSessionFactory();
Session session = sessionFactory.openSession();
UserDetails ud = null;
Set<Address> userAddress = null;
try {
session.beginTransaction();
ud = (UserDetails) session.get(UserDetails.class, 1);
userAddress = ud.getAddresses();
session.getTransaction().commit();
} catch (HibernateException e) {
e.printStackTrace();
session.getTransaction().rollback();
} finally {
session.close();
}
System.out.println(ud.getName());
for(Address addr: userAddress){
System.out.println("State " + addr.getState());
}
Run Code Online (Sandbox Code Playgroud)
在ud.getAddresses()简单地返回一组Address用户的ES.
我的问题是:ud即使会话已经关闭,为什么对象仍然具有其值(例如,名称)?getAddresses()是类的实例变量UserDetails.但为什么我不能检索它的值,但我可以检索UserDetails该类的常规实例变量?
ud.getAddresses()是一个@EmbeddedCollection.
doa*_*nnx 19
我在JPA/Hibernate中遇到了同样的问题,有两种方法可以解决这个问题:
1 /默认关闭LAZY,如下所示:
@Entity
@Proxy(lazy = false)
public class Project {
...
}
Run Code Online (Sandbox Code Playgroud)
当然,由于性能问题,不建议采用这种方式,因此您可以采用第二种方式.
2 /您可以在方法的开头放置@Transactional,它可以帮助您保持会话或其他理解,它将会话的任务传递给Hibernate,如下所示:
@Test
@Transactional
public void testSaveGroup() {
Department g = new Department();
g.setName("XDG");
assertNull(g.getId());
this.groupRepo.save(g);
assertNotNull(g.getId());
System.out.println(g.getId());
Project dummyPrj = new Project(123L, "KSTA", new Date(), "NEW", "Helm AG", g);
this.projectRepo.save(dummyPrj);
// verify
List<Department> lst = this.groupRepo.findAll();
Project savedPrj = this.projectRepo.getOne(123L);
Assert.assertEquals("XDG", savedPrj.getGroup().getName());
}
Run Code Online (Sandbox Code Playgroud)
我的回答很晚,但希望能帮助别人:)
Vik*_*dor 15
userAddress = ud.getAddresses();
session.getTransaction().commit();
for(Address addr: userAddress) {
Run Code Online (Sandbox Code Playgroud)
用于处理惰性关联的hibernate文档明确地将这种访问称为错误.只有在会话仍处于打开状态时,您才能与延迟关联的对象进行交互.文档的这一部分还提供了访问对象的延迟关联成员的替代方法,我们更倾向于在我们的应用程序中将获取模式指定为使用标准中的JOIN.
| 归档时间: |
|
| 查看次数: |
65039 次 |
| 最近记录: |