gpt4 book ai didi

java - Hibernate updatable = false UUID 字段已更新

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:17:17 24 4
gpt4 key购买 nike

我正在将 Spring Data JPA 与 Hibernate 一起使用,但在 @Column 上的 updatable=false 属性方面遇到了问题注释。

我的所有 @Entity 都有一个基类具有如下定义的 UUID 的对象:

@MappedSuperclass
@Getter @Setter @EqualsAndHashCode(of= {"uuid"})
public abstract class AbstractEntity implements Persistable<Long> {

@Id
@GeneratedValue(strategy = AUTO)
@Column(unique = true, updatable = false)
private Long id;

@Column(unique = true, updatable = false)
private UUID uuid = UUID.randomUUID();

}

注意 updatable = false注释。

为了验证 UUID 字段实际上是不可更新的,我编写了这个测试:

@Test
public void testChangeUUID() {

User user = userRepo.findOne(1L);

assertNotNull(user);
assertEquals(USER_UUID, user.getUuid().toString());

final UUID newUuid = UUID.randomUUID();

user.setUuid(newUuid);

user = userRepo.save(user);

assertEquals(newUuid, user.getUuid());

User user2 = userRepo.findOne(1L);
assertNotNull(user2);
assertEquals("UUID should not have changed", USER_UUID, user2.getUuid().toString());
}

我实际上期望在调用 userRepo.save(user) 时抛出异常,但这不会发生。相反,最后的 assertEquals()失败,这意味着 UUID 实际上正在更新。

这是预期的行为吗?有什么办法可以防止 UUID 被更改吗?

最佳答案

根据 documentation , updatable 属性决定该列是否是更新语句的一部分。这意味着 Hibernate 在向数据库发送更新时会忽略它。因此,内存状态和数据库状态将不同。

要验证这一点,请尝试在调用 User user2 = userRepo.findOne(1L) 之前清除 session (逐出)

关于java - Hibernate updatable = false UUID 字段已更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27488767/

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