Hibernate实体缓存在id以外的字段上

时间:2011-09-15 13:18:57

标签: hibernate caching ehcache

我有一个具有无数据主键(@Id)的实体和一个唯一但有意义(stockTicker)的属性。该实体的客户有时通过@Id标准请求结果,有时通过stockTicker标准请求结果。我希望缓存能够达到任何一个标准。 @Id标准没问题。我可以在stockTicker上考虑2个缓存命中解决方案。我可以创建一个单独的实体并将@Id设置为stockTicker,这将允许使用二级缓存。或者,我可以打开查询缓存。我真的不想打开查询缓存,因为在同一个EntityManager中还有其他实体我并不想要缓存。因此,我必须将此查询分解为单独的持久性单元。请建议其中一种方法是否正确,或者是否有更好的选择。

@Entity
@Immutable
@Cache(usage= CacheConcurrencyStrategy.READ_ONLY)
@Table(name = "Security")
public class SecurityEntity {
    @Id
    private Integer id;
    private String stockTicker;
...

1 个答案:

答案 0 :(得分:2)

理想情况下,我的偏好是使用股票代码作为ID。这似乎是一个你有一个非常好的自然键的情况,所以不需要代理。

但是,根据您的对象模型,我会选择查询缓存选项。幸运的是,似乎Hibernate lets you control the query cache in a reasonably fine-grained way

  

如上所述,大多数查询都不会受益于缓存或其结果。因此,默认情况下,即使在启用查询缓存后,也不会缓存单个查询。要为特定查询启用结果缓存,请调用org.hibernate.Query.setCacheable(true)。此调用允许查询查找现有缓存结果,或在执行时将其结果添加到缓存中。

你非常明智地使用JPA接口来使用Hibernate,但是,我觉得你可以得到同样的效果using a query hint

  

org.hibernate.cacheable:查询是否可缓存(例如,new Boolean(true)),默认为false

我绝不是Hibernate专家,但似乎你不需要将你的实体移动到它自己的持久单元中的单独监禁中,以便为它启用查询缓存。