Java 工作单元克隆中遇到JPA Null或零主键

Java 工作单元克隆中遇到JPA Null或零主键,java,sql,oracle,jakarta-ee,jpa,Java,Sql,Oracle,Jakarta Ee,Jpa,我学习了JPA,我的任务是创建数据库并向其中插入一些值。我想知道如何找出最近插入的对象的ID,因此我找到了一种方法,需要使用EntityManager的flush方法 不幸的是,我得到了 工作单元克隆中遇到Null或零主键 使用上述方法时出现异常。我认为问题在于我的数据库将所有ID设置为autoincrement(我使用ORACLE 11G Express),因此在提交之前,它具有null值,并回滚事务 我能做些什么来修复它? 这是DB(ID是自动增量[oracle中的序列和触发器]): 地址

我学习了
JPA
,我的任务是创建数据库并向其中插入一些值。我想知道如何找出最近插入的对象的ID,因此我找到了一种方法,需要使用
EntityManager
flush
方法

不幸的是,我得到了

工作单元克隆中遇到Null或零主键

使用上述方法时出现异常。我认为问题在于我的数据库将所有
ID设置为autoincrement(我使用ORACLE 11G Express),因此在提交之前,它具有
null
值,并回滚事务

我能做些什么来修复它?

这是DB(ID是自动增量[oracle中的序列和触发器]):

地址类


为了让JPA知道DB将自动生成id,您需要在id字段上添加注释:

@Id
@Basic(optional = false)
@Column(name = "A_ID")
@SequenceGenerator( name = "mySeq", sequenceName = "MY_SEQ", allocationSize = 1, initialValue = 1 )
@GeneratedValue(strategy=GenerationType.IDENTITY, generator="mySeq")
private BigDecimal aId;
使用oracle,您可以使用
GenerationType.IDENTITY
@SequenceGenerator
在这种情况下,您不需要触发器来查询序列并填充ID,JPA将为您执行此操作。我不确定
GenerationType.AUTO
是否可以与oracle一起使用,但如果可以,您需要一个触发器来查询序列并填充id。
GenerationType.TABLE
是最可移植的解决方案,因为您使用JPA管理的独立表来存储序列,它可以跨所有数据库工作


检查上面链接中的文档。

我遇到了这种情况,因为我手动向数据库添加了一个id为0(零)的条目。 在我的例子中,EclipseLink“无法”处理零的id。 因此,我在persistence.xml中添加了以下内容:

     <property name="eclipselink.allow-zero-id" value="true"/>

此属性表示EclipseLink将零作为有效id处理


[1]

正如您所说,问题在于,即使在提交事务时,也不会立即调用自动增量函数。实际上,当您使用同一个EntityManager管理数据库交互时,它不会。 我的问题是:为什么要坚持,然后在刷新事务时提交事务?在我看来像是重复的代码。
请参见刷新。

我需要添加以下行
@GeneratedValue(strategy=GenerationType.IDENTITY,generator=“SEQ_ADDRESS”)
,所有其他带有
序列的组合
自动
等。抛出异常。我不确定它是工作正常还是只是一个意外。对于
AUTO
它抛出的
表或视图不存在
,对于
序列
-
名为[SEQ\u ADDRESS]的序列设置不正确。它的增量与其预分配大小不匹配。
您能给我解释一下吗?:Psure,刚刚编辑过,如果您需要更多信息,这里有大量关于这方面的文档。祝你好运,谢谢。这正是我一直在寻找的解决方案。我有@Camilo Bermudez建议的(GeneratedValue annotation),但在我在数据库中添加了一个ID为0的用户后,我就开始出现这个错误。这在我使用序列时发生。以1开头,但以0开头。此属性现在已弃用。使用
您是否有任何关于弃用的官方文档?@kdoteu当然,它是在javadoc中声明的:虽然此链接可以回答问题,但最好在此处包含答案的基本部分,并提供链接供参考。如果链接页面发生更改,仅链接的答案可能无效。-@这是一个答案。“自动增量函数不会立即调用。实际上,当您使用同一个EntityManager管理数据库交互时,它不会”正在回答。问题包括回答中可能涉及的代码。你提到的链接也包含代码,我认为你的答案最好包含相关代码,这样即使链接关闭,你的答案也会有效。谢谢你的提示。我会记住的;我仍然不习惯工具提示,并试图让答案尽可能简短。
@Id
@Basic(optional = false)
@Column(name = "A_ID")
@SequenceGenerator( name = "mySeq", sequenceName = "MY_SEQ", allocationSize = 1, initialValue = 1 )
@GeneratedValue(strategy=GenerationType.IDENTITY, generator="mySeq")
private BigDecimal aId;
     <property name="eclipselink.allow-zero-id" value="true"/>