Hibernate:集合缓存未被驱逐

时间:2017-12-05 09:33:08

标签: java hibernate ehcache

我遇到了Hibernate集合缓存问题(通过EHCache)。

所以,这是拥有该集合的实体:

@Entity(name = "Message")
@Table(name = "t_message")
public class Message implements Comparable<Message>{
    @Id
    @Column(name = "message_id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;

    @OneToMany(cascade = { CascadeType.ALL }, fetch = FetchType.EAGER, mappedBy = "message")
    @Sort(type = SortType.NATURAL)
    @JsonIgnore
    @org.hibernate.annotations.Cache(usage = CacheConcurrencyStrategy.TRANSACTIONAL)
    private SortedSet<Event> events = new TreeSet<>();

    // ...
}

然后,在另一个实体中,消息有一个对称:

@Entity(name = "Event")
@Table(name = "t_event")
@org.hibernate.annotations.Cache(usage = CacheConcurrencyStrategy.TRANSACTIONAL)
public class Event implements Comparable<Event>, Comparator<Event> {
    @Id
    @Column(name = "event_id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "event_message_id", referencedColumnName = "message_id")
    @org.hibernate.annotations.Cache(usage = CacheConcurrencyStrategy.TRANSACTIONAL)
    private Message message;

    // ...
}

问题:当我添加一个Event,“events”字段时,缓存不会被驱逐。如果我删除此字段下面的@Cache anotation,它可以工作但当然没有缓存。

我认为这必须与以下事实相关联:当插入新事件(通过实体操作)时,我们将它链接到事件端的消息,所以我在hibernate配置文件中添加了这一行:

<property name="hibernate.cache.auto_evict_collection_cache">true</property>

但它没有解决问题。

其他信息:

  • 其他ManyToOne集合缓存在项目中完美运行。
  • 项目中没有本机查询,只有HQL和实体操作。
  • 我正在使用Hibernate 4.3.2和EHCache 2.10.4。

感谢您的建议。

1 个答案:

答案 0 :(得分:0)

好的,只是想出了一个&#34;级联&#34;消息的事件字段@OneToMany注释中缺少参数:

@ManyToOne(cascade = { CascadeType.ALL }, fetch = FetchType.LAZY)
@JoinColumn(name = "event_message_id", referencedColumnName = "message_id")
@org.hibernate.annotations.Cache(usage = CacheConcurrencyStrategy.TRANSACTIONAL)
private Message message;

解决了!