Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.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
带有SequenceGenerator的javax.persistence.EntityExistsException_Java_Oracle_Hibernate_Jpa 2.0 - Fatal编程技术网

带有SequenceGenerator的javax.persistence.EntityExistsException

带有SequenceGenerator的javax.persistence.EntityExistsException,java,oracle,hibernate,jpa-2.0,Java,Oracle,Hibernate,Jpa 2.0,我正在Oracle数据库中插入一些记录。为了唯一性,我使用SequenceGenerator。代码如下: public class XxspPoInLineLocqty implements Serializable { @Id @SequenceGenerator(name = "SequenceLocIdGenerator", sequenceName = "LINE_LOCQTY_JPA_ID_SQ") @GeneratedValue(strategy = Gen

我正在Oracle数据库中插入一些记录。为了唯一性,我使用SequenceGenerator。代码如下:

public class XxspPoInLineLocqty implements Serializable {
    @Id 
    @SequenceGenerator(name = "SequenceLocIdGenerator", sequenceName = "LINE_LOCQTY_JPA_ID_SQ")
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SequenceLocIdGenerator")
    @Column(name="LINE_LOCQTY_JPA_ID")
    private Long lineLocqtyJPAId;

//other fields..
}
XxspPoInLineLocqty与XxspPoInLine有@manytone关系。当我坚持使用xxspoinline实体时,我收到以下错误:

javax.persistence.EntityExistsException: A different object with the same identifier value was already associated with the session : [com.bcone.oracle.ebs.model.XxspPoInLineLocqty#76]
    at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:116)
    at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:155)
    at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:162)
    at org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:804)
    at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:764)
    at org.hibernate.jpa.event.internal.core.JpaPersistEventListener$1.cascade(JpaPersistEventListener.java:80)
    at org.hibernate.engine.internal.Cascade.cascadeToOne(Cascade.java:391)
我查看了stackoverflow并找到了一些解决方案: 1。使用allocationSize=1 由于我有5000+
xxspoinlinelocqty
,这将是我可以应用的最差选项。我也尝试过,但40分钟后,我的网络出现波动,坚持失败。我不能使用此选项,因为它会降低性能

2。增加分配大小的值 我增加了allocationSize=500,但在不同的标识符(#372)上仍然面临相同的问题

甚至尝试了GenerationType.AUTO,但运气不佳。 以下是Oracle DB上的顺序:

CREATE SEQUENCE  "APPS"."LINE_LOCQTY_JPA_ID_SQ"  MINVALUE 1 MAXVALUE 999999999999999999999999999 INCREMENT BY 1 START WITH 7641 CACHE 20 NOORDER  NOCYCLE ;
我仍然不明白为什么会出现这个问题。我不明白这件事的根本原因。有人能给我解释一下这个异常的根本原因吗?应该做些什么


注意:在插入记录之前,我删除了表中的所有行。因此,当我执行上述sequence代码时,该表为空。

allocationSize
参数必须与序列的
增量
值匹配。

它的工作方式是,Hibernate从序列(从数据库)中获取一个值,然后将该值保留在内存中,并生成下一个X后续标识符(其中X=allocationSize),将该值在内存中递增1,而不触及数据库。

一旦Hibernate生成X标识符,它就会从序列中获取下一个值,并生成新的X标识符,将该值增加1


一个简单的例子——假设:

  • @SequenceGenerator(…allocationSize=5…)
  • 创建序列。。。。增加1…
在上述情况下,请休眠:

  • 从序列中获取第一个数字,比如说
    NextVal=1
    ,并将其存储在内存中
  • 生成下一个
    allocationSize=5
    标识符,将上述值递增1,即:
    Id=1,2,3,4,5
  • 从序列中获取下一个数字-由于
    增量为1
    ,因此
    nextVal
    将为:
    2
  • 生成下一个
    allocationSize=5
    标识符,将上述值递增1,即:
    Id=2,3,4,5,6
  • 如您所见,它将导致重复错误。


    现在请考虑这种情况:

    • @SequenceGenerator(…allocationSize=5…)
    • 创建序列。。。。增加5…
    在这种情况下,请休眠:

  • 从序列中获取第一个数字,比如说
    NextVal=1
    ,并将其存储在内存中
  • 生成下一个
    allocationSize=5
    标识符,将上述值递增1,即:
    Id=1,2,3,4,5
  • 从序列中获取下一个数字-由于
    增量为5
    ,因此
    nextVal
    将为:
    6
  • 生成下一个
    allocationSize=5
    标识符,将上述值递增1,即:
    Id=6,7,8,9,10
  • 在这种情况下,没有重复错误。


    最后一种情况的缺点是,如果在Hibernate之外使用该序列,那么该序列将产生间隙

    CREATE SEQUENCE  "APPS"."LINE_LOCQTY_JPA_ID_SQ"  MINVALUE 1 MAXVALUE 999999999999999999999999999 INCREMENT BY 1 START WITH 7641 CACHE 20 NOORDER  NOCYCLE ;