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"/>