我正在使用Hibernate 4,Spring 3处理Web应用程序。我几天都在努力解决问题。
在应用程序中,我有一个名为' User':
的实体类@Entity
public class User {
@Id
private int uid;
@Column(unique = true)
private String username;
private String password;
private boolean confirmed;
//... getters and setters
}
此实体类是从名为' user'的table
数据库映射的。
还有另一个名为'确认':
的实体类@Entity
@NamedQueries({
@NamedQuery(name = "getAllConfirmations", query = "select c from Confirmation c")
})
public class Confirmation {
@Id
private String username;
private boolean confirmed;
//... getters and setters
}
此实体类是从名为'确认'的view
数据库映射的。
create view confirmation
as
select username,confirmed from user
我的服务类中有一个方法来获取所有确认对象的列表:
public List<Confirmation> getListOfConfirmations() {
Query query = entityManager.createNamedQuery("getAllConfirmations");
return query.getResultList();
}
此外,还有一种方法可以确认用户对象 - 设置确认字段&#39; true&#39;:
public int confirmUser(int uid) {
User user = getUser(uid);
if (user != null) {
user.setConfirmed(true);
try {
entityManager.getTransaction().begin();
entityManager.merge(user);
entityManager.getTransaction().commit();
return 1;
} catch (Exception e) {
e.printStackTrace();
}
}
return 0;
}
当我调用confirmUser()
时它工作正常,用户对象及其在数据库中的行将被更改,但是当我在更改后调用getListOfConfirmations()
时,不会在结果列表中查看更改
默认情况下,hibernate似乎会查询查看结果。
有没有办法防止hibernate阻止缓存此结果。
此外,我已经尝试了@Cacheable(false)
确认课程,或者为@QueryHint(name = "org.hibernate.cacheable", value = "false")
命名查询设置getAllConfirmations
,这些都不起作用。
持久性配置:
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="2.0">
<persistence-unit name="MyPU" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
<class>bob.jpacache.Confirmation</class>
<class>bob.jpacache.User</class>
<exclude-unlisted-classes>false</exclude-unlisted-classes>
<properties>
<property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/>
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5InnoDBDialect"/>
<property name="hibernate.connection.url" value="jdbc:mysql://localhost/cachetest"/>
<property name="hibernate.connection.username" value="root"/>
<property name="hibernate.connection.password" value="root"/>
<property name="hibernate.hbm2ddl.auto" value="update"/>
<property name="hibernate.show_sql" value="true"/>
<property name="hibernate.format_sql" value="true"/>
</properties>
</persistence-unit>
</persistence>
提前感谢您的帮助。
答案 0 :(得分:1)
@Cacheable指的是二级缓存,你的问题在我看来是在第一级缓存中。我相信问题出在你的EntityManager的生命周期中(你什么时候创建一个新的,你什么时候关闭它),做一个简单的测试:在更改用户的对象之后,尝试调用entityManager .clear()然后查询您的确认对象。注意:必须在将用于进行查询的同一EntityManager上调用entityManager.clear()。
另一个细节,不知道他的真正目的是什么,但查询没有过滤器。因此,无论用户是否必须确认,都将始终带有用户表的所有记录。