【发布时间】:2018-09-17 07:48:26
【问题描述】:
我尝试使用测试数据准备集成测试。我从外部文件中读取插入查询并将它们作为本机查询执行。插入后我执行select setval('vlan_id_seq', 2000, true );。这是实体 ID 定义:
@Id
@Column(name = "id", unique = true, nullable = false)
@GeneratedValue(strategy = IDENTITY)
private Integer id;
当我尝试持久化一个新条目时,我收到了 Caused by: org.postgresql.util.PSQLException: ERROR: duplicate key value violates unique constraint "vlan_pkey"
Detail: Key (id)=(1) already exists. 异常。该序列的ID为2000。列定义由serial宏完成,为id integer NOT NULL DEFAULT nextval('vlan_id_seq'::regclass)。
我在用户事务中执行了本机查询,因此所有测试条目都存储在 postgresql 数据库中,但似乎休眠不同步序列。 entityManager.flush(); 也没有强制进行序列同步。似乎休眠没有使用带有@GeneratedValue(strategy = IDENTITY) 的序列。我使用 XA-Datasource 和 wildfly 13。
我现在测试了另一种初始化方法。我在 persitence.xml (javax.persistence.sql-load-script-source) 中定义了一个 SQL 数据脚本(我用Jailer 生成了脚本),并用select pg_catalog.setval('vlan_id_seq', (SELECT max(id) FROM vlan), true ); 结束了脚本。我在第一个persist命令之前设置了一个断点,检查postgresql db中的序列,序列的最大id值为16。现在持久化工作并且条目的id为17。脚本在实体管理器启动和休眠之前执行开始时读取更新的序列。但是这个解决方案没有回答我的问题。
hibernate 是否有可能重新读取序列以使用 nextval 值?
【问题讨论】:
标签: java postgresql hibernate jpa