Java 多线程中的Hibernate@GeneratedValue序列
我有两个主要实体Dog和Cat,它们都有不同的字段,除了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
id
和dataVersion
,id字段不是由
hibernate
或db生成的。字段
dataVersion
是使用相同的db序列生成的。问题是这样的,我有两个线程:
Dog
将其保持,然后休眠30秒Cat
并提交它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();
});
}
}