【发布时间】:2016-03-18 17:14:58
【问题描述】:
我的查询返回过时的数据库数据时遇到问题,因此我认为它与缓存有关。我完全不明白发生了什么,我很想知道。
我有一个映射到实体的数据库表应用程序:
@Entity
@Table(name = "app_application", catalog = "something", schema = "")
@XmlRootElement
@NamedQueries({
@NamedQuery(name = "Application.findById",
query = "SELECT a FROM Application a WHERE a.id = :id"))
}
)
public class Application implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "id")
private Integer id;
...
@JoinColumn(name = "status", referencedColumnName = "id")
@ManyToOne(optional = false)
private ApplicationStatus status;
....
我还在 Dropwizard 中实现了一个 REST 服务,我可以在其中获取这些野兽:
@GET
@Timed
@Path("/{id}")
public Application findById(@PathParam("id") int id) {
return em.find(Application.class, id); // em is an entity manager
}
如果我启动 Dropwizard 应用程序并访问此资源,我的应用程序将第一次正确返回。然后,如果我转到数据库并手动将应用程序状态值从“接受”更改为“拒绝”(外键),并再次访问我的 REST 服务以获取相同的应用程序,它不会更新状态属性(我的手动数据库更改被忽略)。如果我关闭整个系统并重新启动,REST 服务会获取更新后的值并正确返回实体(直到我再次手动修改数据库)。
这是我的持久化单元:
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
<persistence-unit name="to.rented_RentedToPMS_jar_1.0-SNAPSHOTPU" transaction-type="RESOURCE_LOCAL">
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
<class>pms.core.entities.applications.Application</class>
<class>pms.core.entities.applications.ApplicationStatus</class>
<properties>
<property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/rented?zeroDateTimeBehavior=convertToNull"/>
<property name="javax.persistence.jdbc.user" value="someuser"/>
<property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
<property name="javax.persistence.jdbc.password" value="somepassword"/>
</properties>
</persistence-unit>
</persistence>
没有任何结果,我尝试添加:
<property name="eclipselink.query-results-cache" value="false"/>
<property name="eclipselink.cache.shared.default" value="false"/>
以及使用带有提示的 NameQuery 进行获取:
setHint(QueryHints.CACHE_USAGE, CacheUsage.DoNotCheckCache)
谁能帮我解释一下是怎么回事?
编辑:
这似乎解决了这个问题。但是,这是否意味着我需要为每个实体调用刷新?如果我想获取所有应用程序怎么办?我是否需要遍历所有这些并刷新?这对我来说似乎很愚蠢,所以我想答案是否定的......
@GET
@Timed
@Path("/noauth/{id}")
public Application findById(@PathParam("id") int id) {
Application a = em.find(Application.class, id);
em.refresh(a);
return a;
}
【问题讨论】:
标签: java jpa caching eclipselink dropwizard