【发布时间】:2010-12-23 08:49:10
【问题描述】:
我的 Hibernate 支持的 Jpa 查询返回不是最新的数据时遇到问题。我认为这是从缓存而不是数据库本身提取数据的问题。
例如,我将在一个页面上更改和持久化一个对象,然后返回到上一页,其中列出了数据库的行,它将显示对象在更改之前存在的样子。我可以在我的日志中看到我的 DAO 触发了我的查询,我可以进入数据库并查看更改已保留,但是当我转到下一页时,JPA 没有从数据库中提取最新数据。
我相信可能有某种会话缓存在起作用,因为当我在另一个网络浏览器中加载页面时,我不会看到更新的数据库视图。
我该如何解决这个问题?
编辑:我做了一些后续测试,包括登录我的控制器以确保我的 MVC 框架(Spring MVC)没有缓存任何东西。事实并非如此,即使在控制器级别上它也会看到过时的数据库信息。
这是我的 ORM 实体文件中的映射 sn-p;
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = true)
@Column(name = "ID", nullable = false)
private Integer id;
@Basic(optional = false)
@Column(name = "Name", nullable = false, length = 100)
private String name;
@Basic(optional = false)
@Column(name = "DayOffset", nullable = false)
private int dayOffset;
@Basic(optional = false)
@Column(name = "StartTime", nullable = false, length = 5)
private String startTime;
@Basic(optional = false)
@Column(name = "Enabled", nullable = false)
private boolean enabled;
@Basic(optional = false)
@Column(name = "LastTouched", insertable = false, updatable = false, nullable =
false)
@Temporal(TemporalType.TIMESTAMP)
private Date lastTouched;
@Column(name = "TouchedBy", length = 50)
private String touchedBy;
@JoinTable(name = "ReconciliationSearchRule",
joinColumns = {@JoinColumn(name = "ReconciliationId",
referencedColumnName = "ID", nullable = false)},
inverseJoinColumns = {@JoinColumn(name = "SearchRuleId",
referencedColumnName = "ID", nullable = false)})
@ManyToMany(fetch = FetchType.LAZY)
private Collection<SearchRule> searchRuleCollection;
@JoinColumn(name = "ServerId", referencedColumnName = "ID", nullable = false)
@ManyToOne(optional = false, fetch = FetchType.LAZY)
private Server server;
@OneToMany(mappedBy = "reconciliation")
private Collection<Report> reportCollection;
【问题讨论】:
-
“我可以看到我的 DAO 触发了我的查询”是什么意思?您的意思是您看到 SQL 被发送到数据库吗?你怎么知道你一开始就正确地坚持了改变?
-
你如何保存你的实体? EntityManager.persist() 或 .merge() ?
标签: java hibernate orm jpa persistence