Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Jpa查询从缓存而不是数据库中提取?_Java_Hibernate_Orm_Jpa_Persistence - Fatal编程技术网

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

Java Jpa查询从缓存而不是数据库中提取?,java,hibernate,orm,jpa,persistence,Java,Hibernate,Orm,Jpa,Persistence,我遇到了一个问题,我的Hibernate支持的Jpa查询返回的数据不是最新的。我假设这是一个从缓存而不是数据库本身提取数据的问题 例如,我将在一个页面上更改并保留一个对象,然后返回到上一个页面,该页面列出了数据库的行,它将显示更改之前存在的对象。我可以在日志中看到我的DAO发出的查询,我可以进入数据库并看到更改已被持久化,但是当我转到下一页时,JPA没有从数据库中提取最新数据 我相信可能有某种会话缓存在工作,因为当我在另一个web浏览器中加载页面时,我不会看到更新的数据库视图 如何解决此问题 编

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

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

我相信可能有某种会话缓存在工作,因为当我在另一个web浏览器中加载页面时,我不会看到更新的数据库视图

如何解决此问题

编辑:我已经做了一些后续测试,包括登录我的控制器以确保我的MVC框架(Spring MVC)没有缓存任何东西。即使在控制器级别,它也不会看到过时的数据库信息


下面是我的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;
private static final long serialVersionUID=1L;
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
@基本(可选=真)
@列(name=“ID”,nullable=false)
私有整数id;
@基本(可选=假)
@列(name=“name”,null=false,长度=100)
私有字符串名称;
@基本(可选=假)
@列(name=“DayOffset”,nullable=false)
私人国际贸易日抵销;
@基本(可选=假)
@列(name=“StartTime”,null=false,长度=5)
私有字符串开始时间;
@基本(可选=假)
@列(name=“Enabled”,nullable=false)
启用私有布尔值;
@基本(可选=假)
@列(name=“lastpothed”,insertable=false,updateable=false,null=
(错误)
@时态(TemporalType.TIMESTAMP)
私人约会;
@列(name=“TouchedBy”,长度=50)
私人字符串被触摸;
@JoinTable(name=“对账专用规则”,
joinColumns={@JoinColumn(name=“ReconciliationId”,
referencedColumnName=“ID”,nullable=false)},
inverseJoinColumns={@JoinColumn(name=“SearchRuleId”,
referencedColumnName=“ID”,nullable=false)})
@ManyToMany(fetch=FetchType.LAZY)
私人收藏;
@JoinColumn(name=“ServerId”,referencedColumnName=“ID”,nullable=false)
@ManyToOne(可选=false,fetch=FetchType.LAZY)
专用服务器;
@OneToMany(mappedBy=“对账”)
私人收藏;

有两种方法:

  • 在相关实体上使用
    @DataCache(timeout=1000)
    设置逐出策略,并将其设置为适合您使用的对象类型的合理值
  • 对实体或类调用
    execute(…)
    。具体的实现细节取决于您使用的提供程序(如Hibernate)
  • 例如,我将在一个页面上更改并保留一个对象,然后返回到上一个页面,该页面列出了数据库的行,它将显示更改之前存在的对象

    二级缓存管理应该是透明的,您不必在任何更新之后手动退出一个实体,二级缓存将通过Hibernate“自动”使目标表失效

    所以,我的问题是:“回到上一页”是什么意思?你是说使用导航器的“后退”按钮吗?你重新加载页面了吗?你能澄清一下吗


    另外,你能发布你的映射文件或注释实体吗?

    我知道发生了什么。我的DAO作为原型(也称为非单例)被注入,因此为DAO的每次使用创建了支持EntityManager。对特定EntityManager的查询不会注册EntityManager外部的数据库更改


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

    您所说的“我可以从我的DAO看到我的查询”是什么意思?您的意思是看到SQL被发送到数据库吗?首先,您如何知道您正确地保存了更改?如何保存您的实体?EntityManager.persist()或.merge()?对于1,您能用@DataCache更详细地解释一下吗?对于2,哪个类具有逐出方法?谢谢。Hibernate会话有execute(),这不适合您;)@DataCache是放置在未刷新的类上的注释(因为它是缓存的)。此批注将指示JPA按超时参数指定的频率退出(或清除)此类型对象的缓存。@rynmrtn,因此您将实体类放在ORM层中。@DataCache的默认值是什么?在哪里可以找到java文档?@rynmrtn,@DataCache是Hibernate注释吗?我的IDE不知道从哪里导入它,而且我也没有找到它的文档。如果它是Hibernate,我就不能直接使用它,因为我正试图通过JPA.Pascal工作,通过返回,我单击一个超链接,将我带到另一个页面。星期一上班的时候我会发布更多的信息。