Java @Entity类
它有一个@Id字段,但这不是问题所在,所以这不是关于管理或创建Id的。
我们在实体中有许多其他字段,其中一些具有DB管理的默认值,使用包含以下内容的SQL查询创建;
blah blah VARCHAR(20) NOT NULL DEFAULT 'Blue';
我们使用Postgres数据库,flyway用于数据库迁移,zonky作为组件测试的可嵌入数据库。因此,我们不使用Jpa来创建数据库,而是使用flyway。
使用'spring-boot-starter-data-jpa',版本:'2.7.6'我们发现以下内容可以很好地与插入时填充的DB默认值一起工作,并且在更新时也可以更新/覆盖新值;
@Generated(GenerationTime.INSERT)
@Column(name = "colour", nullable = false)
private String colour;
然而,当我们现在升级到SpringBoot 3/Hibernate 6时,我们发现GenerationTime已被弃用,我们正在努力寻找一个可以工作的注解。我们已经尝试了新的EventType.INSERT,如下所示;
示例 Spring Boot 3.1
@Generated(event = EventType.INSERT)
private String colour;
这个新的EventType允许在字段为null时生成默认值,但是当我们尝试更新新字段值时,将忽略该字段值并保留默认值。在同一个保存()中,其他字段更新正常。即,我们调用repository.save(),其中实体colour = red,但在检索和DB检查时,颜色仍然是默认的“蓝色”,而其他非默认启用的字段被正确更新!
有什么办法解决这个问题吗?(除了切换到实体默认定义,我们已经被指示不要这样做!)
#data is set up in Flyway scripts as follows;
CREATE TABLE IF NOT EXISTS simple_account
(
id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
email VARCHAR(255) NOT NULL,
password VARCHAR(255) NOT NULL,
first_name VARCHAR(255),
last_name VARCHAR(255),
home_office VARCHAR(255) NOT NULL DEFAULT 'Plymouth'
);
insert into simple_account (email, password, first_name, last_name, home_office)
VALUES ('[email protected]', 'password', 'user2', 'foo', 'Swansea');
@Test
public void testFindAndUpdateAccountPreviouslySaved() {
String email = "[email protected]";
SimpleAccount recovered = simpleAccountRepo.findByEmail(email);
// check that we have the SimpleAccount that we are expecting
assertEquals(email, recovered.getEmail());
assertEquals("Swansea", recovered.getHomeOffice());
// Set first_name (regular field) and home_office a not null default field
recovered.setFirstName("Bob");
recovered.setHomeOffice("Blackpool");
simpleAccountRepo.save(recovered);
simpleAccountRepo.flush();
SimpleAccount recovered2 = simpleAccountRepo.findByEmail(email);
//Worked fine
assertEquals("Bob", recovered2.getFirstName());
//Failed to update
assertEquals("Blackpool", recovered2.getHomeOffice());
}
2条答案
按热度按时间vyu0f0g11#
在对google进行了大量的阅读和一些尝试和错误之后,我终于找到了一些适用于我所有测试用例的东西;
1.我可以插入一个没有值的新记录,并设置默认值。
1.我可以插入具有不同值的新记录,并且该值已设置为而不是默认值。
1.我可以检索具有默认值的现有记录并更新该值!
68bkxrlz2#
我认为缺少的部分是用
@DynamicInsert
注解类,这告诉hibernate不要在insert语句中将列值作为null发送。这个类的javadocs有更多的信息。这也是值得检查hibernate用户指南。