可以使用Postgres序列和Hibernate映射制作可查询的计数器吗?



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

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

我知道这意味着我需要使其成为类的属性,但我无法找到将序列添加到类的方法,只能找到如何使序列为类生成 ID。

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

因此,这个问题是有效的,但通往解决方案的道路却朝着错误的方向前进。将序列映射到托管域实体不是一个"好"主意,因为这是两个不同的概念。

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

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

描述如下:

Query createNativeQuery(java.lang.String sqlString)

创建一个用于执行本机SQL 语句的查询实例,例如,用于更新或删除。

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

退货: 新查询实例

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

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

这使您可以选择将下一个有效序列值读取为longNumber实例,以便进行编程。

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

希望这有帮助。

最新更新