是否可以在不调用 JPA 中调用 SET ter 的情况下更新实体



我正在开发应用程序,该应用程序具有一个名为 My.java 的实体,它正在从另一个具有名为 edited 的字段的实体扩展而来。 对于每次更新,此字段将使用当前时间戳进行更新

我正在使用单表继承策略。

我正在使用 jpa/eclipse 链接作为持久性提供程序。

编辑的字段正在使用当前时间戳进行更新 即使没有调用 setter 方法,我的 Java 代码中也没有其他引用更改此编辑字段的值。

调试时,我可以看到 UPDATE QL 语句,用于编辑字段更新。

我真的很想知道为什么/如何更新值,没有二传手调用就可以吗?

下面是映射的超类:

@MappedSuperclass
public abstract class SuperEntity implements  Serializable {    
/**
* 
*/
private static final long serialVersionUID = 1125783654888232605L;
/**
* The time the entry was created
*/
@Column(name = "CREATED")
private Timestamp created;
/**
* The date the entry was edited
*/
@Column(name = "EDITED")
@Version
private Timestamp edited;

检查这些东西。

  1. 您的实体可能正在实施某种可审核的接口
  2. 您的字段可能具有@Version注释

在第一种情况下,您已经弄清楚了界面的用法,并且可以理解它 在第两种情况下,它是 EJB 和 Hibernate 中的默认和预期行为。

我在谷歌搜索后得到了这个链接可能对你有用

https://technology.amis.nl/2006/01/03/ejb-30-persistence-using-the-version-annotation-for-optimistic-locking-in-the-glassfish-reference-implementation/

这不是一件大事,你可以轻松克服它

是的。JPA 实现不需要类的某些属性侦听器或代理来检测值是否已通过 setter 更新。它们检测对托管实例的更改的方式可能取决于实现,但支持通过直接访问而不是 getter/setter 对字段进行更新。例如,可以保留通过持久性管理器获取的实例的副本,并且在完成事务或发出提交时,将您可能已对其进行更改的托管实例与其原始实例进行比较,并根据需要对数据库进行更新。

实际上,可以通过以下注释显式指定如何执行对实体类的访问: https://docs.oracle.com/javaee/7/api/javax/persistence/Access.html

相反,可能有些属性不受字段支持,而是具有计算值的 getter。使用属性访问时,这些也会导致在从代码创建数据库时生成列,并在持久化或合并实体时插入/更新值。

简而言之,仅调用资源库并不是将托管实体中的属性或持久字段标记为"脏"的原因。如果可以直接访问字段并对其进行更改,也会导致更新。

带有@Version注释的字段将由休眠自动控制,并用于其乐观锁定功能。

因此,当您保存实体时,Hibernate本身会自动设置该字段。

最新更新