gpt4 book ai didi

mysql - Hibernate CURRENT_TIMESTAMP 和 MySQL 中的多实体事务

转载 作者:行者123 更新时间:2023-11-29 21:02:12 25 4
gpt4 key购买 nike

我有两个使用 JPA 声明的不同实体(A 和 B),并在同一个事务中使用 Hibernate(mysql 5.6.30、Hibernate 3.6.8 和 Spring 4.2.1)进行持久化。两个实体都包含此列:

`created_at` DATETIME(6) DEFAULT CURRENT_TIMESTAMP(6)

当我在同一事务中创建 A 和 B 时,A 和 B 的 created_at 将会不同。

我的测试使用 Spring 并定义如下:

@Autowired
private TransactionTemplate inTx;

@Test
public void test() {
inTx.execute(__ -> {
aRepository.add(a);
bRepository.add(b);
return null;
});
}

我非常确定这些实体位于同一事务中,因为 aRepositorybRepository 中的 add 方法的定义注释如下这个:

@Transactional(propagation = Propagation.MANDATORY)

我还尝试将测试更改为如下所示:

@Test
public void test() {
inTx.execute(__ -> {
aRepository.add(a);
Thread.sleep(1000);
bRepository.add(b);
return null;
});
}

这会产生如下结果:

java.lang.AssertionError: [A and B should have the same timestamp]
Expecting:
<[2016-05-09T14:16:28.531,
2016-05-09T14:16:28.532]>
to contain only:
<[2016-05-09T14:16:28.531]>
but the following elements were unexpected:
<[2016-05-09T14:16:28.532]>

即时间戳非常接近但不相同。我的直觉表明 A 和 B 的 created_at完全相同,因为它们是同一事务的一部分。所以我的问题是:

  1. 这是预期的行为还是我做错了什么?
  2. 如果这是预期的行为,是否有办法保留事务结束时间而不是实体创建时间? (这样对于同一事务中保存的所有实体,created_at 时间戳都相同)

最佳答案

这确实是预期的行为。一旦项目被插入数据库,该值就会被设置(如果事先没有设置)。因此,根据服务器的速度,可能会有差异。

如果您想使用数据库来控制这一点,您最好的选择是根据事务结束更新时间的触发器。

您还可以在 Java 中通过在插入之前设置当前日期来完成此操作。创建一个日期实例一次并在所有实体上设置它。这样数据库默认值就不会生效。

关于mysql - Hibernate CURRENT_TIMESTAMP 和 MySQL 中的多实体事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37115811/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com