我想从一个数据库中批量获取多个Hibernate映射对象。据我所知,Hibernate (或我所知道的任何Java ORM )目前都不支持这一点。因此,我使用RMI编写了一个实现此API的驱动程序:
interface HibernateBatchDriver extends Remote
{
Serializable [] execute (String [] hqlQueries) throws RemoteException;
}此API的实现针对本地数据库打开一个Hibernate会话,逐个发出查询,对结果进行批处理,然后将结果返回给调用者。这样做的问题是,获取的对象在被发回后不再附加任何会话,因此以后从此类对象访问延迟获取的字段时,最终会出现no Session错误。有没有解决这个问题的办法?我不认为Session对象是可序列化的,否则我也会通过网络发送它们。
发布于 2013-05-18 12:25:05
正如@dcernahoschi提到的,Session对象是Serializable,但JDBC连接不是。Serializable意味着你将一些东西保存到一个文件中,然后你读到它,它就是同一个对象。您不能将JDBC连接保存到某个文件,然后再从该文件恢复它。您应该打开一个新的JDBC连接。
因此,即使您可以通过RMI发送会话,您也需要远程计算机中的JDBC连接。但是,如果可以在远程计算机上设置会话,为什么不在该计算机上执行查询呢?
如果您想通过RMI发送查询结果,那么您需要做的就是获取整个对象,而不是懒惰地获取。为此,您必须将所有关系定义为在映射中急切获取的关系。
如果您不能将映射更改为eager,那么还有一种替代方法,即获取每个对象的“深层”副本,并通过RMI发送此对象。创建对象的深层副本需要一些努力,但是如果您不能将映射更改为急切获取,这是唯一的解决方案。这种方法意味着您的接口方法必须更改为类似以下内容:
List[] execute (String [] hqlQueries) throws RemoteException;方法result中的每个列表将保留由一个查询获取的结果。
发布于 2013-05-18 14:21:50
Hibernate Session对象是Serializable。底层JDBC连接则不是。因此,可以在序列化之前断开会话与JDBC连接的连接(),并在反序列化之后重新连接()会话。
不幸的是,如果您需要将会话发送到无法获得新JDBC连接的主机,这对您没有多大帮助。因此,唯一的选择是完全加载对象,序列化并将它们发送到远程主机。
https://stackoverflow.com/questions/16620445
复制相似问题