Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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 多线程中的Hibernate@GeneratedValue序列_Java_Multithreading_Hibernate_Jpa_Spring Data Jpa - Fatal编程技术网

Java 多线程中的Hibernate@GeneratedValue序列

Java 多线程中的Hibernate@GeneratedValue序列,java,multithreading,hibernate,jpa,spring-data-jpa,Java,Multithreading,Hibernate,Jpa,Spring Data Jpa,我有两个主要实体Dog和Cat,它们都有不同的字段,除了id和dataVersion, id字段不是由hibernate或db生成的。 字段dataVersion是使用相同的db序列生成的。 问题是这样的,我有两个线程: 线程1创建实体Dog将其保持,然后休眠30秒 线程2在线程1后10秒启动,线程2保持实体Cat并提交它 线程1在30秒后提交 我希望数据库具有数据版本2的实体Dog,以及数据版本1的实体Cat, 但不知何故,实体Dog有数据版本1,实体Cat有数据版本2。 我在互联网上搜索过a

我有两个主要实体Dog和Cat,它们都有不同的字段,除了
id
dataVersion

id字段不是由
hibernate
或db生成的。
字段
dataVersion
是使用相同的db序列生成的。

问题是这样的,我有两个线程:

  • 线程1创建实体
    Dog
    将其保持,然后休眠30秒
  • 线程2在线程1后10秒启动,线程2保持实体
    Cat
    并提交它
  • 线程1在30秒后提交
  • 我希望数据库具有数据版本2的实体
    Dog
    ,以及数据版本1的实体
    Cat
    , 但不知何故,实体
    Dog
    有数据版本1,实体
    Cat
    有数据版本2。

    我在互联网上搜索过allot,我发现该值是在刷新事务时生成的,所以我关闭了自动刷新。刷新仅在事务已提交且我仍未获得预期结果时发生。

    我想知道这个问题的原因是什么


    这是开始运行时要计算的代码

    @Component
    public class Example {
        private ThreadPoolTaskExecutor threadPoolTaskExecutor = new ThreadPoolTaskExecutor();
        @Autowired
        private DBAccessor accessor;
    
        @PostConstruct
        public void example() {
            threadPoolTaskExecutor.initialize();
    
            // Starts dog's thread
            threadPoolTaskExecutor.execute(() -> {
                Dog dog = new Dog();
                dog.setId(UUID.randomUUID().toString());
    
                accessor.persist(dog);
    
                sleep(30 * SECOND);
    
                accessor.commit();
            });
    
           // Starts dog's thread
            threadPoolTaskExecutor.execute(() -> {
                sleep(10 * SECOND);
    
                Cat cat = new Cat();
                cat.setId(UUID.randomUUID().toString());
    
                accessor.persist(cat);
                accessor.commit();
            });
        }
    }
    

    只要持久性提供程序遵守规范(即,只要实体在数据库中具有唯一的ID),它就可以随时生成ID

    您不应该假设ID是在刷新时生成的,因为情况并非如此


    您不必关心猫的ID是否比狗低或高:重要的是ID是唯一的。

    持久性提供程序可以随时生成ID,只要它遵守规范(即,只要实体在数据库中具有唯一的ID)。您不应该假设ID是在刷新时生成的,因为情况并非如此。你不应该在意猫的ID是比狗低还是比狗高:重要的是ID是唯一的。@jbnize你能不能把这个作为答案贴出来?我已经厌倦了在评论中阅读答案为的开放式问题。首先感谢您的回答:)出于个人原因,我的程序根据提交的顺序生成价值是很重要的。如果你知道如何实现这一点,我很乐意听到:)
    @Component
    public class Example {
        private ThreadPoolTaskExecutor threadPoolTaskExecutor = new ThreadPoolTaskExecutor();
        @Autowired
        private DBAccessor accessor;
    
        @PostConstruct
        public void example() {
            threadPoolTaskExecutor.initialize();
    
            // Starts dog's thread
            threadPoolTaskExecutor.execute(() -> {
                Dog dog = new Dog();
                dog.setId(UUID.randomUUID().toString());
    
                accessor.persist(dog);
    
                sleep(30 * SECOND);
    
                accessor.commit();
            });
    
           // Starts dog's thread
            threadPoolTaskExecutor.execute(() -> {
                sleep(10 * SECOND);
    
                Cat cat = new Cat();
                cat.setId(UUID.randomUUID().toString());
    
                accessor.persist(cat);
                accessor.commit();
            });
        }
    }