0

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

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

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

4

2 回答 2

1

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

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

于 2013-05-18T06:21:49.683 回答
1

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

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

如果你想通过 RMI 发送查询结果,那么你需要做的是获取整个对象而不是延迟获取。为此,您必须将所有关系定义为在映射中急切获取。

如果您不能将映射更改为渴望,那么还有另一种方法可以获取每个对象的“深层”副本并通过 RMI 发送该对象。创建对象的深层副本需要一些努力,但如果您不能将映射更改为渴望获取,那么它是唯一的解决方案。这种方法意味着您的接口方法必须更改为:

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

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

于 2013-05-18T04:25:04.753 回答