【发布时间】:2012-08-03 06:26:27
【问题描述】:
所以我们的项目使用 PostgreSQL 数据库,我们使用 JPA 来操作数据库。 我们已经在 Netbeans 7.1.2 中使用自动创建者从数据库中创建了实体。
经过小的改动,我们的主键值被描述为:
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Basic(optional = false)
@NotNull
@Column(name = "idwebuser", nullable = false)
private Integer idwebuser;
问题是现在应用程序不灵活,因为当我们直接修改数据库(使用 SQL 或其他工具)而不是通过 Java 应用程序时 - 生成的值低于实际的数据库 ID 值 - 所以我们在创建新实体时出错。
JPA 是否有可能让数据库自动生成 ID,然后在创建过程后获取它? 或者有什么更好的解决方案? 谢谢。
编辑 进一步来说: 我们有一个用户表,我的问题是使用任何类型的策略生成类型,JPA 正在插入一个由其生成器 ID 指定的新实体。这对我来说是错误的,因为如果我自己更改表,通过添加新条目,应用程序的 GeneratedValue 低于当前 ID - 这导致我们出现重复 ID 的异常。 我们可以修复它;)?
关于答案的简短说明 我有一个小谎言,因为我们使用了 PG Admin -> 查看前 100 行并从那里编辑行,而不是使用 select。无论如何,事实证明这个编辑器以某种方式跳过了更新 ID 的过程,因此即使在 DB 中,当我们编写正确的 INSERT 时,它也会以不正确的 ID 执行!所以基本上是我们使用的编辑器的问题,而不是数据库和应用的问题……
现在它甚至可以使用 @GeneratedValue(strategy=GenerationType.IDENTITY)
【问题讨论】:
-
这是否意味着 JPA 没有使用 PostgreSQL 序列?表中该列的定义是什么?那是
serial还是只是一个“整数” -
我们使用的是串行字段类型。我将在主要问题@a_horse_with_no_name 中更多地描述这个问题
-
所以这确实意味着 JPA 不 使用关联的序列?这很奇怪。
-
在测试期间,我们现在大约有 17 行,我们使用:
@SequenceGenerator(name="pk_sequence",sequenceName="entity_id_seq") @GeneratedValue(strategy=GenerationType.SEQUENCE,generator="pk_sequence")我们刚刚收到错误Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.2.0.v20110202-r8913): org.eclipse.persistence.exceptions.DatabaseException Internal Exception: org.postgresql.util.PSQLException: ERROR: duplicate key value violates unique constraint "webuser_idwebuser_pk" Detail: Key (idwebuser)=(14) already exists.所以看起来还是有问题。 -
序列使用有冲突。显然,并非所有插入都使用相同的策略来生成 PK。
标签: postgresql jakarta-ee jpa netbeans entity