Java JPA:如何将设置PK插入到MAX(PK)+1
场景:我遇到了一些在事务中混合使用JPA和JDBC的代码。JDBC在一个基本上是空行的表中进行插入,将主键设置为选择MAXPK+1,将middleName设置为临时时间戳。然后,该方法从同一个表中为maxPK+选择该临时时间戳,以检查是否存在冲突。如果成功,它将清空middleName并更新。该方法返回新创建的主键 问题: 是否有更好的方法将实体插入数据库,将PK设置为maxpk+1,并最好使用JPA访问新创建的PK 环境: 使用EclipseLink并需要支持Oracle和MS SqlServer数据库的多个版本 额外的背景:我问这个问题的原因是,在运行集成测试时,当作为链的一部分调用此方法时,我遇到了java.sql.BatchUpdateException。链的上部使用JPA EntityManager来持久化一些对象 有问题的方法Java JPA:如何将设置PK插入到MAX(PK)+1,java,jpa,jdbc,insert,Java,Jpa,Jdbc,Insert,场景:我遇到了一些在事务中混合使用JPA和JDBC的代码。JDBC在一个基本上是空行的表中进行插入,将主键设置为选择MAXPK+1,将middleName设置为临时时间戳。然后,该方法从同一个表中为maxPK+选择该临时时间戳,以检查是否存在冲突。如果成功,它将清空middleName并更新。该方法返回新创建的主键 问题: 是否有更好的方法将实体插入数据库,将PK设置为maxpk+1,并最好使用JPA访问新创建的PK 环境: 使用EclipseLink并需要支持Oracle和MS SqlServ
首先:回答这个问题很痛苦。但我知道,有时候你不得不面对魔鬼: 所以从技术上讲,它不是JPA,但是如果您使用Hibernate作为JPA提供者,您可以使用它
@org.hibernate.annotations.GenericGenerator(
name = “incrementGenerator”,
strategy = “org.hibernate.id.IncrementGenerator”)
@GeneratedValue(generator="incrementGenerator")
private Long primaryKey;
Hibernate解决方案是线程安全的,但不是群集安全的,也就是说,如果在多台主机上运行应用程序,这可能会失败。您可以捕获相应的异常并重试
如果您坚持使用您的解决方案:关闭ResultSet、语句和连接。很抱歉,最初没有抓住资源的机会。首先:回答这个问题很痛苦。但我知道,有时候你不得不面对魔鬼: 所以从技术上讲,它不是JPA,但是如果您使用Hibernate作为JPA提供者,您可以使用它
@org.hibernate.annotations.GenericGenerator(
name = “incrementGenerator”,
strategy = “org.hibernate.id.IncrementGenerator”)
@GeneratedValue(generator="incrementGenerator")
private Long primaryKey;
Hibernate解决方案是线程安全的,但不是群集安全的,也就是说,如果在多台主机上运行应用程序,这可能会失败。您可以捕获相应的异常并重试
如果您坚持使用您的解决方案:关闭ResultSet、语句和连接。很抱歉,最初没有使用资源进行尝试。JDBC代码是病态的,没有意义,并且在多用户环境中无法工作 我强烈建议修改代码以使用序列对象或序列表 在JPA中,您可以使用排序 看,, 如果你真的想做你自己的序列,你可以自己分配Id,使用PrePersist分配你自己的Id,或者在EclipseLink中实现你自己的序列子类,做你想做的事情。您需要使用SessionCustomizer注册此序列对象 看,,
JDBC代码是病态的,毫无意义,在多用户环境中无法工作 我强烈建议修改代码以使用序列对象或序列表 在JPA中,您可以使用排序 看,, 如果你真的想做你自己的序列,你可以自己分配Id,使用PrePersist分配你自己的Id,或者在EclipseLink中实现你自己的序列子类,做你想做的事情。您需要使用SessionCustomizer注册此序列对象 看,,
不要这样做。这是个糟糕的主意。Id在多用户环境中无法正常工作,并且无法扩展。使用序列或DBMS支持的任何生成器。JPA可以配置为使用数据库的方式生成唯一的ID。我完全同意-但在某些情况下,我们束手无策。您能告诉我们您不接受/不能接受的答案是什么吗?我的意思是,为什么你不能使用序列呢?我想说改变数据库是我唯一能做的事。我会投弃权票,但我不能为这个案子选择它。不要这样做。这是个糟糕的主意。Id在多用户环境中无法正常工作,并且无法扩展。使用序列或DBMS支持的任何生成器。JPA可以配置为使用数据库的方式生成唯一的ID。我完全同意-但在某些情况下,我们束手无策。您能告诉我们您不接受/不能接受的答案是什么吗?我的意思是,为什么你不能使用序列呢?我想说改变数据库是我唯一能做的事。我会投弃权票,但我不能在这个案例中选择它。对不起,我应该提到我们正在使用EclipseLink。我们试图坚持严格的JPAAPI,但我们已经有EclipseLink API特定的泄漏,所以我对此持开放态度。我会仔细研究,看看是否有一个EL等价于IncrementGenerator。对不起,我应该提到我们正在使用EclipseLink。我们试图坚持严格的JPAAPI,但我们已经有EclipseLink API特定的泄漏,所以我对此持开放态度。我会仔细研究,看看是否有一个EL等价于IncrementGenerator。