是否有可能更新实体,而不是在jpa中调用setter

时间:2017-04-06 14:03:32

标签: java jpa eclipselink

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

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

我使用jpa / eclipse链接作为持久性提供者。

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

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

我真的想知道为什么/如何更新它的值,它可以通过setter调用来实现?

这是映射的超类:

ha_bar=[(736389.41666666663, 24.317, 25.109, 24.317, 24.29975), 
(736389.4375, 24.308374999999998, 25.529, 25.027750000000001, 
25.027750000000001), (736389.45833333337, 24.668062499999998, 25.977, 
25.543499999999998, 25.543499999999998), (736389.47847222222, 25.10578125, 
25.898, 25.541249999999998, 25.541249999999998), (736389.5625, 
25.323515624999999, 25.818000000000001, 25.454000000000001, 
25.454000000000001)]


import numpy as np
import matplotlib.pyplot as plt
import matplotlib.finance as mpf
import matplotlib.ticker as ticker
from matplotlib.dates import DateFormatter

fig, ax = plt.subplots()
ax.xaxis.set_major_formatter(DateFormatter('%y-%m-%d %H:%M:%S'))
mpf.candlestick_ohlc(ax, ha_bar,width=0.6)
fig.autofmt_xdate()
plt.show()

3 个答案:

答案 0 :(得分:1)

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

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

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

简而言之,只是调用setter并不会将托管实体中的属性或持久字段标记为“脏”。如果您可以直接访问某个字段并进行更改,那么这也会导致更新。

答案 1 :(得分:1)

其上带有@Version注释的字段将由hibernate自动控制,并用于其optimistic locking功能。

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

答案 2 :(得分:1)

检查这些事情。

  1. 您的实体可能正在实施某种可审核的界面
  2. 您的字段可能包含@Version注释
  3. 在第一种情况下,您已经确定了界面使用情况并且您可以理解它 在第二种情况下,它是EJB和Hibernate中的默认和预期行为。

    我在谷歌搜索后获得此链接可能对您有用

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

    这不是一个很大的担忧,你可以轻松克服它