Java DynamicCupDate在update语句中添加了额外的未触及列

Java DynamicCupDate在update语句中添加了额外的未触及列,java,postgresql,hibernate,spring-boot,spring-data-jpa,Java,Postgresql,Hibernate,Spring Boot,Spring Data Jpa,我在使用@DynamicUpdate处理我的一个实体时遇到了一个奇怪的行为。我的实体是这样定义的 @实体 @动态铜日期 @表(name=“courts”) @吸气剂 @塞特 @建筑商 @AllArgsConstructor//需要@Builder才能正常工作 @NoArgsConstructor//hibernate映射需要 公营法院{ @身份证 @GeneratedValue(策略=GenerationType.IDENTITY) 私人长id; //名称是SQL关键字 @列(name=“cou

我在使用@DynamicUpdate处理我的一个实体时遇到了一个奇怪的行为。我的实体是这样定义的

@实体
@动态铜日期
@表(name=“courts”)
@吸气剂
@塞特
@建筑商
@AllArgsConstructor//需要@Builder才能正常工作
@NoArgsConstructor//hibernate映射需要
公营法院{
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
私人长id;
//名称是SQL关键字
@列(name=“court\u name”)
私有字符串名称;
@纵队
私家街;;
@纵队
专用字符串地址;
@纵队
私人住宅区;
@纵队
私人城市;
@纵队
私人国家;
@纵队
私有字符串电话号码;
@列(nullable=false)
@Convert(converter=DOTimestampConverter.class)
@CreationTimestamp
私有分区DateTime createdAt;
@列(nullable=false)
@Convert(converter=DOTimestampConverter.class)
@UpdateTimestamp
私有分区DateTime updatedAt;
}
DOTimestampConverter
只是一个简单的
AttributeConverter
ZonedDateTime
转换为ms,以便我将其作为数字存储在DB中

如您所见,我用
@DynamicUpdate
标记了实体

我有一个小的jersey REST-API,它允许我更新id和生成日期旁边的所有正常字段。在实际触摸字段的setter之前,我总是检查输入是否为
null

我看到
address\u city
列有一个非常奇怪的行为,它会被包括在每次这样的更新中,即使我只接触其他字段,在这种情况下,只有
名称
,它被翻译成
法庭名称
,因为
名称
是SQL中的保留关键字更新实际上问题不仅仅在于
地址\城市
列。即使忽略该列,update语句中也会包含其他列

Hibernate: 
    update
        courts 
    set
        address_city=?,
        court_name=?,
        updated_at=? 
    where
        id=?
如果我只编辑
地址\u city
,那么我就可以正确地看到它

Hibernate: 
    update
        courts 
    set
        address_city=?,
        updated_at=? 
    where
        id=?
以前有人遇到过这个问题吗? 我使用的堆栈是

spring-boot 2.1.3.RELEASE
spring-boot-starter-data-jpa
postgresql 11.4
以及数据模式

创建表格球场(
id串行主键,
法院名称VARCHAR(20),
地址(瓦查尔街)(128),,
地址:沃德·瓦查尔(20),
地址:瓦查尔区(20),
地址:瓦查尔市(20),
地址:瓦查尔(10),
电话号码VARCHAR(20),
在BIGINT处创建的_不为NULL,
在BIGINT处更新的_不为空
);
这就是如何通过REST-API进行更新

@Override
    public Court editCourt(String courtId, CreateCourtRequest createCourtRequest) {
        Optional<CourtDO> court = courtRepository.findById(NumberUtils.toLong(courtId));

        return court
            .map(courtDO -> editCourtInfo(courtDO, createCourtRequest))
            .map(courtRepository::save)
            .map(courtDOToResponseConverter::convert)
            .orElse(null);
    }

    private CourtDO editCourtInfo(CourtDO courtDO, CreateCourtRequest createCourtRequest) {
        if (StringUtils.isNotBlank(createCourtRequest.getName())) {
            courtDO.setName(createCourtRequest.getName());
        }

        if (StringUtils.isNotBlank(createCourtRequest.getAddressStreet())) {
            courtDO.setAddressStreet(createCourtRequest.getAddressStreet());
        }

        if (StringUtils.isNotBlank(createCourtRequest.getAddressWard())) {
            courtDO.setAddressWard(createCourtRequest.getAddressWard());
        }

        if (StringUtils.isNotBlank(createCourtRequest.getAddressDistrict())) {
            courtDO.setAddressDistrict(createCourtRequest.getAddressDistrict());
        }

        if (StringUtils.isNotBlank(createCourtRequest.getAddressCity())) {
            courtDO.setAddressCity(createCourtRequest.getAddressCity());
        }

        if (StringUtils.isNotBlank(createCourtRequest.getPhoneNumber())) {
            courtDO.setPhoneNumber(createCourtRequest.getPhoneNumber());
        }

        return courtDO;
    }
@覆盖
public Court editCourt(字符串courtId,CreateCourtRequest CreateCourtRequest){
可选court=courtRepository.findById(numberrutils.toLong(courtId));
返回法庭
.map(courtDO->editCourtInfo(courtDO,createCourtRequest))
.map(存储库::保存)
.map(courtDOToResponseConverter::convert)
.orElse(空);
}
private CourtDO editCourtInfo(CourtDO CourtDO,CreateCourtRequest CreateCourtRequest){
if(StringUtils.isNotBlank(createCourtRequest.getName())){
setName(createCourtRequest.getName());
}
if(StringUtils.isNotBlank(createCourtRequest.getAddressStreet()){
setAddressStreet(createCourtRequest.getAddressStreet());
}
if(StringUtils.isNotBlank(createCourtRequest.getAddressWard())){
setAddressWard(createCourtRequest.getAddressWard());
}
if(StringUtils.isNotBlank(createCourtRequest.getAddressDistrict()){
setAddressDistrict(createCourtRequest.getAddressDistrict());
}
if(StringUtils.isNotBlank(createCourtRequest.getAddressCity()){
setAddressCity(createCourtRequest.getAddressCity());
}
if(StringUtils.isNotBlank(createCourtRequest.getPhoneNumber())){
setPhoneNumber(createCourtRequest.getPhoneNumber());
}
返回courtDO;
}

REST-API如何更新实体中的值,您能提供详细信息吗?我已经尝试过,但它没有更新其他字段2019-07-31 10:02:39.299调试11569---[main]org.hibernate.SQL:update courts set court_name=?id=?@YogeshPrajapati您介意试试我的设置吗?我开始怀疑hibernate版本可能有bug,当我试图覆盖
5.4.4.Final
版本而不是默认的
5.3.7.Final
时,问题就消失了。您可以提供有关REST-API如何更新实体中的值的详细信息吗?我已经尝试过,但它没有更新其他字段2019-07-31 10:02:39.299 DEBUG 11569-[main]org.hibernate.SQL:更新法院设置法院名称=?id=?@YogeshPrajapati您介意试试我的设置吗?我开始怀疑hibernate版本可能存在错误,因为我试图覆盖
5.4.4.Final
版本,而不是默认的
5.3.7.Final
,然后问题就消失了