当前位置: 首页 > 知识库问答 >
问题:

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

蓬新
2023-03-14

我使用的是spring data jpa,我有一个实体,代码如下:

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

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

我使用org . spring framework . data . JPA . repository . JPA repository进行相关的CRUD操作。

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

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

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

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

共有2个答案

公冶渝
2023-03-14

@Stefan说@Col的方式(updatable=false)只影响数据库层

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

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

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

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

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

艾成益
2023-03-14

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

 类似资料:
  • 我最近在我的项目中添加了mapStruct。这个框架很酷,但我想不出一件事。 这就是我的情况:我有个人档案和个人类型的实体和字段。我想用ProfileDto更新它。我正在为此使用void fromDto(ProfileDto dto,@MappingTarget Profile entity)方法。问题是,映射器总是创建新的人物,而不是使用个人资料实体中的人物 我的实体是: dto 我的映射器 生

  • 以下是我要保存(创建/更新)的实体模型: 有两种方法可以更新此实体: < li >第一个更新除< code>notified属性以外的所有属性的人 < li >第二个更新< code>notified属性的仅 有没有办法告诉Hibernate忽略某个特定方法的某些字段?我需要创建两个不同的特定dao方法吗?我是否需要为经典的< code>save方法保留< code>updatable=false

  • 我有两个实体具有@OneTomany(Entity1)&@ManyToOne(Entity2)双向关系。在@OneTomany关系中,我有@Cascading{Cascade.All}。但是当我在事务或方法中将具有@ManyToOne关系的实体的初始为false的boolean属性更改为true,然后又变回false时,它会导致数据库触发更新查询,将实体的boolean设置为false,这似乎是错

  • 我正在为我的新项目使用android room持久性库。我想更新表的某些字段。我在我的中尝试过- 但是,当我尝试使用此方法进行更新时,它会更新实体的每个字段,在这些字段中,它与tour对象的主键值相匹配。我已使用 它正在工作,但在我的情况下会有很多查询,因为我的实体中有很多字段。我想知道如何更新某些字段(不是全部),如,id=1;(id是自动生成主键)。

  • 问题内容: 我在Access中创建了一个查找表,以提供列的可能值。现在,我需要使用转换列之前的数据来更新此列。我无法弄清楚将运行的SQL查询。我不断收到错误消息“ UPDATE或DELETE查询不能包含多值字段。” 我的研究表明,我只需要设置列的值,但这总是更新0条记录: 我知道如果更改它以更新文本列,此查询将起作用,因此仅此列绝对是一个问题。 问题答案: 如果要将值添加到多值字段,请使用追加查询

  • 问题内容: 有没有一种方法可以使字段在使用JPA-Hibernate 4进行更新操作时不持久,但在创建操作时持久化? 我以这种方式尝试过 但是使用@Transient注释时,该字段将在所有CRUD操作中都是瞬态的,我想要一种方法来指定仅在此操作上是持久性的(创建)。 有没有办法做到这一点? 谢谢! 问题答案: 如本文所述,您需要设置为: 该属性指示Hibernate从生成的SQL语句中忽略此列。