Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JPA:如何将设置PK插入到MAX(PK)+1_Java_Jpa_Jdbc_Insert - Fatal编程技术网

Java JPA:如何将设置PK插入到MAX(PK)+1

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和JDBC的代码。JDBC在一个基本上是空行的表中进行插入,将主键设置为选择MAXPK+1,将middleName设置为临时时间戳。然后,该方法从同一个表中为maxPK+选择该临时时间戳,以检查是否存在冲突。如果成功,它将清空middleName并更新。该方法返回新创建的主键

问题: 是否有更好的方法将实体插入数据库,将PK设置为maxpk+1,并最好使用JPA访问新创建的PK

环境: 使用EclipseLink并需要支持Oracle和MS SqlServer数据库的多个版本

额外的背景:我问这个问题的原因是,在运行集成测试时,当作为链的一部分调用此方法时,我遇到了java.sql.BatchUpdateException。链的上部使用JPA EntityManager来持久化一些对象

有问题的方法


首先:回答这个问题很痛苦。但我知道,有时候你不得不面对魔鬼:

所以从技术上讲,它不是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。