批量获取hibernate映射对象



我想从数据库中批量获取多个Hibernate映射对象。据我所知,Hibernate(或我所知道的任何Java ORM)目前都不支持这一点。所以我用RMI写了一个驱动程序来实现这个API:

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

这个API的实现打开一个针对本地数据库的Hibernate会话,一个接一个地发出查询,将结果批量处理,并将它们返回给调用者。这样做的问题是,获取的对象在被发送回来后不再有任何Session附加到它们上,因此,稍后从这些对象访问惰性获取的字段最终会出现无会话错误。这个问题有解决办法吗?我不认为Session对象是可序列化的,否则我也会通过网络发送它们。

如@dcernahoschi所述,Session对象是Serializable,但JDBC连接不是。Serializable意味着你把一些东西保存到一个文件中,之后你读它,它是同一个对象。您不能将JDBC连接保存到一个文件,然后再从该文件恢复它。您应该打开一个新的JDBC连接。

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

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

如果您不能将映射更改为eager,那么可以选择获取每个对象的"深度"副本并通过RMI发送该对象。创建对象的深层副本需要一些努力,但如果不能将映射更改为即时抓取,这是唯一的解决方案。这种方法意味着您的接口方法必须更改为如下内容:

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

方法result中的每个列表将保留一次查询获取的结果。

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

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

最新更新