繁体   English   中英

使用 updatable=false 更新实体中的字段返回具有新值的字段的实体

[英]Update field in an entity with updatable=false returns the entity with the field with the new value

我正在使用 spring-data-jpa 并且我有一个包含以下代码的实体:

@Id
@GeneratedValue
@Column(columnDefinition = "uuid")
private UUID id;

@Basic(optional = false)
@Column(updatable = false)
private long creationTimestamp;
... 

我使用 org.springframework.data.jpa.repository.JpaRepository 来执行相关的 CRUD 操作。

当我第一次保存实体(例如 creationTimestamp=1)时,方法save(entity)返回保存的实体(如 javadoc 所说),带有用于进一步操作的新id (如 javadoc 所说)和字段creationTimestamp=1

但稍后,如果我尝试使用新的creationTimestamp (例如 creationTimestamp=2)更新此实体,再次使用方法save(entity) ,此方法返回具有字段creationTimestamp=2的实体(这是不正确的)。

如果我使用findById(given_id)方法进行搜索,则返回的实体具有字段creationTimestamp=1 ,这是正确的,因为该列被定义为updatable=false

问题是,为什么当我更新时,方法save(entity)返回creationTimestamp 中的新值而不是数据库中的值? 因为我期望“保存的实体”(如 javadoc 所说)。

此选项不会使属性写保护。 这意味着发送到数据库的 UPDATE 语句应排除该字段。

@Stefan 如何说@Column(updatable = false) updatable @Column(updatable = false)只影响数据库层

在 Stackoverflow 中,有一个关于这个的问题

如果我理解您正在尝试这样做,我建议 Spring 管理此列

        @Id
        @GeneratedValue
        @Column(columnDefinition = "uuid")
        private UUID id;

        @Basic(optional = false)
        @CreationTimestamp
        private java.sql.Timestamp creationTimestamp;

使用此实现,您无需编写代码即可在此属性中设置值。 您只需创建 getter 方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM