【问题标题】:Update field in an entity with updatable=false returns the entity with the field with the new value更新带有可更新=假的实体中的字段返回具有具有新值的字段的实体
【发布时间】:2020-02-11 15:23:07
【问题描述】:

我正在使用 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,这是正确的,因为该列被定义为 可更新=假

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

【问题讨论】:

  • creationTimestamp是如何设置的?
  • 能否给出更新和保存实体的类代码?

标签: java jpa spring-data-jpa


【解决方案1】:

此选项不会使属性写保护。就是说发送到数据库的UPDATE语句要排除这个字段。

【讨论】:

  • 这并没有回答为什么返回的值与数据库中的值不匹配的问题。正如文档所说,它应该返回“保存的实体”。从.save() 返回值的全部意义在于获得正确的数据库表示。
【解决方案2】:

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

Here in Stackoverflow, there are a question about this

如果我理解您正在尝试这样做,我建议 Spring 使用

管理此列
        @Id
        @GeneratedValue
        @Column(columnDefinition = "uuid")
        private UUID id;

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

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

【讨论】:

  • 感谢您的建议,但在我的情况下不适用,因为我使用的是从 json 解析到 myEntity 的控制器。即使这样,如果我通过了 creationTimestamp,我会得到错误的返回值。
  • 您知道 EntityManager 缓存记录吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-01
  • 1970-01-01
  • 2018-08-24
  • 1970-01-01
  • 1970-01-01
  • 2011-03-29
  • 1970-01-01
相关资源
最近更新 更多