@DynamicUpdate在Hibernate(Crud存储库)中保留空值

时间:2019-12-04 10:20:01

标签: hibernate spring-boot jpa dto

我想从API检索一些信息并将其插入数据库。 我会不时提出相同的要求,如果需要,我想更新现有行并插入新行。作为例外,我有一个名为STATUS 的列-不包含在api-中,我不希望通过api请求更新此列,我将使用自己的应用程序更改状态。 我正在尝试使用@DynamicUpdate,但是以某种方式它会保留null值。 注意:我还试图将状态设置为0(被动)作为默认值。

我有一个DTO和相应的休眠实体,如下所示。

@Getter
@Setter
public class CountryDto {

    private String name;
    private String code;

}

ENTITY

@Getter
@Setter
@Entity
@DynamicUpdate
@DynamicInsert
@Table(name = "Country")
public class Country{

    @Id
    @Column(name = "code", length=8)
    private String code;

    @Column(name = "name")
    private String name;

    //I Would like to instert PASSIVE as default status 
    @Column(name = "status", columnDefinition = "int(11) default 0")
    private Status status;

}

控制器

@GetMapping("/getCountries")
public void getCountryRemote() {
    List<CountryDto> countries = aPCService.getCountries();
    persistCountries(mapper.countryDtoToCountryEntity(countries));
}

private void persistCountries(List<Country> countries) {
    countries.forEach((Country country)->{
        countryRepository.save(country);
    });
}

当我第一次运行代码时,它插入日期,我得到以下sql。这就是我想要的,它跳过状态列,因为它为空,并且数据库中的 STATUS列设置为0。

 insert 
    into
        country
        (name, code) 
    values
        (?, ?)

当我第二次运行代码时,数据库中的所有状态列都设置为空。但是我不想改变他们的价值。下面是sql

Hibernate: 
    select
        country0_.code as code1_0_0_,
        country0_.name as name3_0_0_,
        country0_.status as status4_0_0_ 
    from
        country country0_ 
    where
        country0_.code=?
Hibernate: 
    update
        country 
    set
        status=? 
    where
        code=?

我期望休眠状态不会更新STATUS值,因为它为null,并且我正在使用@DynamicUpdate

谢谢

0 个答案:

没有答案