1

运行此查询时出现“节点没有数据类型”错误:

session.createQuery("select nextval( 'next_num_seq' )")

我知道这意味着我需要使它成为一个类的属性,但是我还没有找到一种方法来将一个序列添加到一个类中,只有如何让一个序列为一个类生成 ID。

有没有办法在不是 ID 生成器的 Hibernate 映射中包含序列?

4

1 回答 1

2

因此,这个问题是有效的,但解决方案的道路却朝着错误的方向前进。将序列映射到托管域实体不是一个“好”的想法,因为这是两个独立的概念。

序列,例如您尝试从 PostgreSQL 后端查询的序列,是为元组的主键值或 - 从ORM应用程序的角度 - Java 对象生成唯一 ID 的中心概念。因此,将它们的当前状态映射到域实体并不聪明。取而代之的是,将从这样的序列中提取的单个特定值设置next_num_seq为一个特定的对象,以将其保存在关系数据库中。因此,此类域对象的相关通过例如专用 ORM 注释(或通过类似方法)链接到该序列。

在接口的JavaDoc中,Session我们找到createNativeQuery(String sql)从接口继承的方法EntityManager,另请参见此处

描述如下:

Query createNativeQuery(java.lang.String sqlString)

创建Query实例以执行本机SQL 语句,例如更新或删除。

参数: sqlString - 本机 SQL 查询字符串

返回:新的查询实例

因此,您可以修改代码以对 PostgreSQL 数据库执行本查询,如下所示:

Query q = session.createNativeQuery("select nextval( 'next_num_seq' )");

这使您可以选择将下一个有效序列值作为 alongNumber实例读取以用于编程目的。

请注意:注意不要多次重用此值(对于多个对象),因为这可能会导致后端在使用时出现一致性问题,例如,在单独线程的上下文中。

希望这可以帮助。

于 2017-06-19T22:03:03.923 回答