2011-06-10 56 views
0

当我构建一个Hibernate查询后Hibernate的好习惯,我的代码去如下:分离对象

@SuppressWarnings("unchecked") 
List<SendCommands> list = query.list(); 
session.evict(list); 
if(list.isEmpty()) 
    return null; 
SendCommands dst = list.get(0); 
return dst; 

什么是这个例子中,“良好”习惯:

1)分离(驱逐)整个结果集,然后返回该组的第一个目的,或

2)分离(驱逐)只一组的第一个对象:

@SuppressWarnings("unchecked") 
List<SendCommands> list = query.list(); 
if (list.isEmpty()) 
    return null; 
SendCommands dst = list.get(0); 
session.evict(dst); 
return dst; 
+0

你想达到什么目的?为什么你需要分离物体? – axtavt 2011-06-10 13:01:23

+0

我需要分离对象以将它们传递到另一个图层。根据文档,交易结束时对象会丢失,为什么我想分离它们。 – iliaden 2011-06-10 13:03:20

回答

2

您不需要分离对象。 Hibernate实体是POJO,在事务结束时不会丢失。会话关闭时,会自动分离。但是你仍然可以使用它并访问它们的数据,除非数据被标记为延迟加载并且在实体连接时没有被提取。

+0

谢谢!你能告诉我会发生什么,如果它有一个延迟加载字段,并且会话被关闭。这个字段会变成空指针吗?或者Hibernate会抛出异常? 另外:如果我不分离一个对象,返回它,并在其他地方(同一会话,不同的线程)更新它。返回的值会改变吗? – iliaden 2011-06-10 13:36:07

+0

你会得到一个LazyInitializationException。你的第二个问题没有意义,因为你不应该在不同的线程中使用同一个会话。会话是单线程的。这个基本的,但是使用Hibernate时非常重要的东西。你应该明确地重申hibernate参考文档,这里描述了所有这些:http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html_single – 2011-06-10 13:47:47