Sping Boot 3/Hibernate 6 -如何注解具有DB管理的DEFAULT值的简单字段?

wljmcqd8  于 2023-10-23  发布在  其他
关注(0)|答案(2)|浏览(106)

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());
    }
vyu0f0g1

vyu0f0g11#

在对google进行了大量的阅读和一些尝试和错误之后,我终于找到了一些适用于我所有测试用例的东西;

@GeneratedValue(strategy = GenerationType.AUTO)
private String colour;

1.我可以插入一个没有值的新记录,并设置默认值。
1.我可以插入具有不同值的新记录,并且该值已设置为而不是默认值。
1.我可以检索具有默认值的现有记录并更新该值!

68bkxrlz

68bkxrlz2#

我认为缺少的部分是用@DynamicInsert注解类,这告诉hibernate不要在insert语句中将列值作为null发送。
这个类的javadocs有更多的信息。这也是值得检查hibernate用户指南。

相关问题