如何防止Hibernate缓存?

时间:2015-02-20 22:13:58

标签: java spring hibernate caching jpa

我正在使用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>

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

@Cacheable指的是二级缓存,你的问题在我看来是在第一级缓存中。我相信问题出在你的EntityManager的生命周期中(你什么时候创建一个新的,你什么时候关闭它),做一个简单的测试:在更改用户的对象之后,尝试调用entityManager .clear()然后查询您的确认对象。注意:必须在将用于进行查询的同一EntityManager上调用entityManager.clear()。

另一个细节,不知道他的真正目的是什么,但查询没有过滤器。因此,无论用户是否必须确认,都将始终带有用户表的所有记录。