我们的项目使用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,然后在创建过程之后获取它? 或者还有更好的解决方案吗? 谢谢。
编辑: 更具体地说: 我们有一个用户表,我的问题是使用任何类型的策略generationtype时,JPA都使用由其生成器指定的ID插入新实体。这对我来说是错误的,因为如果我自己对表进行更改,通过添加新条目,应用程序的GeneratedValue低于当前ID - 这导致我们出现重复ID的异常。 我们能不能修复它?;)
对答案的简短说明: 我这边有点撒谎,因为我们使用了PG Admin->查看前100行并从中编辑行,而不是使用SELECT。无论如何,结果发现此编辑器以某种方式跳过更新ID的过程,因此即使在DB中,当我们编写正确的INSERT时,它也会使用不正确的ID执行!所以基本上这更多是我们使用的编辑器的问题,而不是数据库和应用程序...现在甚至可以使用@GeneratedValue(strategy=GenerationType.IDENTITY)。
serial
还是只是一个integer
? - user330315