gpt4 book ai didi

java - Jpa 查询从缓存而不是数据库中提取?

转载 作者:行者123 更新时间:2023-11-30 07:38:27 25 4
gpt4 key购买 nike

我遇到了一个问题,我的 Hibernate 支持的 Jpa 查询返回的数据不是最新的。我认为这是从缓存而不是数据库本身提取数据的问题。

例如,我将在一个页面上更改并保留一个对象,然后返回到上一页,该页面列出了数据库的行,它将显示更改前存在的对象。我可以在我的日志中看到我的 DAO 触发了我的查询,我可以进入数据库并查看更改是否已保留,但是当我转到下一页时,JPA 没有从数据库中提取最新数据。

我相信可能有某种 session 缓存在起作用,因为当我在另一个网络浏览器中加载页面时,我不会看到更新的数据库 View 。

我该如何解决这个问题?

编辑:我做了一些后续测试,包括登录我的 Controller 以确保我的 MVC 框架 (Spring MVC) 没有缓存任何内容。事实并非如此,即使在 Controller 级别,它也会看到过时的数据库信息。


这是我的 ORM 实体文件中的映射片段;

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 被作为原型(prototype)(又名非单例)注入(inject),因此为 DAO 的每次使用创建了支持 EntityManager。 EntityManager 外部的数据库更改不会通过对该特定 EntityManager 的查询进行注册。

当然,将 DAO 设置为单例会导致我的应用程序的多线程部分出现其他问题,但那完全是另一个问题。

关于java - Jpa 查询从缓存而不是数据库中提取?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1848969/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com