在基于DB视图的应用程序中使用二级缓存

时间:2015-09-18 09:15:16

标签: java hibernate caching

我正在为我的应用程序设置二级缓存,它使用Hibernate 3.6.10。我一直在阅读Hibernate文档,在它上面配置二级缓存似乎很简单,只需添加第三方提供程序(在我的情况下它是EhCache)。

但是,我目前正在使用一些数据库视图,以避免必须单步执行寻找某些属性的Hibernate实体。例如,我已经拥有Person实体,该实体属于Organization

<class name="com.mycompany.model.Person" table="tperson">
    <id name="id" column="id" type="integer">
        <generator class="native" />
    </id>
    <property name="name" column="name" />
    <property name="surname1" column="surname1" />
    <property name="emailAddress" column="email" />
    <many-to-one name="organization" 
        class="com.mycompany.model.Organization">
        <column name="id_organization" />
    </many-to-one>
</class>

为了避免必须为每个Organization加载Person属性,特别是在我加载人员列表时,我使用DB视图来进行SQL连接并加载最常见的与人有关的领域。这就是我如何映射它:

<class name="com.mycompany.model.VPerson" table="vperson" mutable="false">
    <id name="id" column="id" type="integer" />
    <property name="name" column="name" />
    <property name="surname1" column="surname1" />
    <property name="emailAddress" column="email" />
    <property name="organizationName" column="organization_name" />
    <property name="clientName" column="client_name" />
</class>

因此,在大多数情况下,当我只想显示数据时,我加载了视图实体,这也避免了必须加载集合,等等。但是,当我想编辑一个具体的人时,我加载Person实体,因为我需要它是可变的。

因此,如果我使用与视图相关的二级缓存,那么当我更新具体的Person时,如何通知Hibernate使其无效?导致二级缓存数据与AFAIK相关to a concrete entity

1 个答案:

答案 0 :(得分:1)

您也可以使用可变视图并更新VPerson实体字段。如果视图实体中未包含任何字段,则可以引入“人工”字样。一个(如updateDateTime)并更改它只是为了将实体实例标记为脏并强制缓存失效/刷新。

另一种方法可能是使用事务缓存并手动驱逐过时的条目。