2013-05-18 27 views
0

我想批量从数据库中获取多个Hibernate映射对象。据我所知,目前尚不支持Hibernate(或者我知道的任何Java ORM)。所以我写了使用RMI实现此API的驱动程序:批处理获取休眠映射对象

interface HibernateBatchDriver extends Remote 
{ 
    Serializable [] execute (String [] hqlQueries) throws RemoteException; 
} 

这个API的实现打开对本地数据库Hibernate会话,发出查询一个接一个,批了的结果,他们返回到呼叫者。这样做的问题是被取回的对象在被发送回去之后不再有任何Session连接到它们,并且因此稍后访问来自这些对象的懒惰获取的字段最终以无会话错误结束。有没有解决这个问题的方法?我不认为Session对象是可序列化的,否则我会通过线路发送它们。

+0

你想发送通过电线查询获取的对象吗? – nakosspy

+0

nakosspy:是的。这就是'执行'返回 – JRR

回答

1

由于@dcernahoschi提到,Session对象是Serializable,但JDBC连接不是。可串行化意味着您将某些内容保存到文件中,稍后再读取它并且它是同一个对象。您无法将JDBC连接保存到文件,并在稍后从该文件恢复。您应该必须打开一个新的JDBC连接。

因此,即使您可以通过RMI发送会话,您也需要在远程计算机上使用JDBC连接。但是,如果可以在远程计算机中设置会话,那么为什么不在该计算机中执行查询呢?

如果你想通过RMI发送查询结果,那么你需要做的是无需懒惰地取回整个对象。为了做到这一点,您必须将所有关系定义为在您的映射中急切提取。

如果您无法将映射更改为渴望,则可以选择获取每个对象的“深层”副本并通过RMI发送此对象。创建对象的深层副本将需要一些努力,但如果无法将映射更改为提前获取,那么它是唯一的解决方案。 这种方法意味着你的接口方法必须改变,以这样的:

List[] execute (String [] hqlQueries) throws RemoteException; 

的方法结果的每个列表将继续通过一个查询获取的结果。

+0

哦。我错过了RMI部分。在这种情况下,发送会话当然没有意义。 +1。 – dcernahoschi

1

休眠Session对象是Serializable。底层的JDBC连接不是。因此,在序列化之前,可以断开()该会话与JDBC连接的连接,并在反序列化之后重新连接()它。

不幸的是,如果您需要将会话发送到无法获得新的JDBC连接的主机,则这无助于您。所以唯一的选择是完全加载对象,将其序列化并发送到远程主机。

+0

+1纠正我。我会编辑我的答案。是的,'Session'是'Serializable'。不幸的是,这对@JRR来说还不够好。在这种情况下,问题是他无法通过RMI发送它,因为远程计算机无法连接到数据库。如果会话可以在远程计算机中恢复,则不是通过RMI发送查询,而是在远程计算机中创建和执行它们。 – nakosspy