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 SpringJPA序列缓存提供了意外的行为。使用分配大小=1是可以的_Java_Jpa_Spring Data Jpa_Sequence_Id Generation - Fatal编程技术网

Java SpringJPA序列缓存提供了意外的行为。使用分配大小=1是可以的

Java SpringJPA序列缓存提供了意外的行为。使用分配大小=1是可以的,java,jpa,spring-data-jpa,sequence,id-generation,Java,Jpa,Spring Data Jpa,Sequence,Id Generation,我的Spring Boot应用程序使用a.o.2实体类。实体类1使用使用序列的技术密钥id。该实体包含其他实体的列表,因此是一对多。子实体使用相同的序列 使用20的Sequence分配(缓存)大小,我发现我得到了EntityExistsException: javax.persistence.EntityExistsException:具有 相同的标识符值已与会话关联: [nl.xyz.app1.entity.ChildFields#123456] 这些实体是: @Entity @Table(n

我的Spring Boot应用程序使用a.o.2实体类。实体类1使用使用序列的技术密钥id。该实体包含其他实体的列表,因此是一对多。子实体使用相同的序列

使用20的Sequence分配(缓存)大小,我发现我得到了EntityExistsException:

javax.persistence.EntityExistsException:具有 相同的标识符值已与会话关联: [nl.xyz.app1.entity.ChildFields#123456]

这些实体是:

@Entity
@Table(name = "CHILD_FIELDS")
public class ChildFields implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO, generator = "my_entity_seq_gen")
    @SequenceGenerator(name = "my_entity_seq_gen", sequenceName = "MYSEQ_S01")
    @Column(name = "CF_ID", unique = true, nullable = false)
    private Long id;

    @Column(name = "CF_DETAILS_ID")
    private Long detailsId;


等。

将JPA与DB序列结合使用时要小心。解决方案使用的allocationSize为1。我用Oracle和Progress测试了这一点

您可以通过找到一个很好的解释Puspender Tanwar,给出了详细的解释

通过将序列IncrementBy值更改为我在JPA的allocationSize中设置的值,可以解决这个问题

创建序列“应用程序”。“行\本地数量\ JPA \ ID \ SQ”最小值1最大值 999999999999999999999999999999999999递增20从7641缓存20开始 noordernocycle

上一个序列的问题说明(递增值1):

  • 当JPA需要Id值时,它点击DB序列并请求唯一值,序列返回7641
  • 现在JPA有了ID的起点,并且基于allocationSize=20,JPA自己创建接下来的20个值并生成7641到7660个唯一ID
  • 现在,当所有这些ID都被使用时,JPA向DB Sequence请求下一个唯一值。由于最后返回的值是7641,所以序列返回7642(因为INCREMENTBY值是1)
  • JPA获取7642并在缓存中创建接下来的20个值
  • 当JPA尝试将这些值分配给ID时,它发现7642已经分配给实体对象(在步骤2)

  • 递增20如何解决了这个问题:当ID在第3步被使用时,JPA要求下一个值进行排序。上一次返回的值是7641,所以这次它将增加20,返回7661。JPA创建从7661到7680的值并使用它们。因此不存在唯一的密钥冲突问题

    将JPA与DB序列结合使用时要小心。解决方案使用的allocationSize为1。我用Oracle和Progress测试了这一点

    您可以通过找到一个很好的解释Puspender Tanwar,给出了详细的解释

    通过将序列IncrementBy值更改为我在JPA的allocationSize中设置的值,可以解决这个问题

    创建序列“应用程序”。“行\本地数量\ JPA \ ID \ SQ”最小值1最大值 999999999999999999999999999999999999递增20从7641缓存20开始 noordernocycle

    上一个序列的问题说明(递增值1):

  • 当JPA需要Id值时,它点击DB序列并请求唯一值,序列返回7641
  • 现在JPA有了ID的起点,并且基于allocationSize=20,JPA自己创建接下来的20个值并生成7641到7660个唯一ID
  • 现在,当所有这些ID都被使用时,JPA向DB Sequence请求下一个唯一值。由于最后返回的值是7641,所以序列返回7642(因为INCREMENTBY值是1)
  • JPA获取7642并在缓存中创建接下来的20个值
  • 当JPA尝试将这些值分配给ID时,它发现7642已经分配给实体对象(在步骤2)
  • 递增20如何解决了这个问题:当ID在第3步被使用时,JPA要求下一个值进行排序。上一次返回的值是7641,所以这次它将增加20,返回7661。JPA创建从7661到7680的值并使用它们。因此不存在唯一的密钥冲突问题

    @Entity
    @Table(name = "PARENTS_OBJECT")
    public class ParentObject implements Serializable {
    
        @Id
        @GeneratedValue(strategy = GenerationType.AUTO, generator = "my_entity_seq_gen")
        @SequenceGenerator(name = "my_entity_seq_gen", sequenceName = "MYSEQ_S01")
        @Column(name = "PF_ID", unique = true, nullable = false)
        private Long id;
    
        @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
        @JoinColumn(name = "CF_DETAILS_ID")
        private List<ChildFields> children;
    
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO, generator = "my_entity_seq_gen" )
    @SequenceGenerator(name = "my_entity_seq_gen", sequenceName = "MYSEQ_S01", allocationSize=1)