休眠:集合缓存未被驱逐
Hibernate : collection cache not evicted
我遇到了 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;
// ...
}
问题: 当我添加一个事件时, "events" 字段,缓存没有被驱逐。如果我删除此字段下方的 @Cache 注释,它可以工作,但当然没有缓存。
我认为这必须 link 插入一个新事件(通过实体操作)时,我们 link 它到来自事件端的消息,所以我添加了这个休眠配置文件上的行:
<property name="hibernate.cache.auto_evict_collection_cache">true</property>
但是并没有解决问题
附加信息:
- 其他 ManyToOne 集合缓存在该项目上完美运行。
- 项目中没有原生查询,只有HQL和实体操作。
- 我正在使用 Hibernate 4.3.2 和 EHCache 2.10.4。
感谢您的建议。
好的,刚刚发现消息的事件字段@OneToMany 注释中缺少 "cascade" 参数:
@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;
已解决!
我遇到了 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;
// ...
}
问题: 当我添加一个事件时, "events" 字段,缓存没有被驱逐。如果我删除此字段下方的 @Cache 注释,它可以工作,但当然没有缓存。
我认为这必须 link 插入一个新事件(通过实体操作)时,我们 link 它到来自事件端的消息,所以我添加了这个休眠配置文件上的行:
<property name="hibernate.cache.auto_evict_collection_cache">true</property>
但是并没有解决问题
附加信息:
- 其他 ManyToOne 集合缓存在该项目上完美运行。
- 项目中没有原生查询,只有HQL和实体操作。
- 我正在使用 Hibernate 4.3.2 和 EHCache 2.10.4。
感谢您的建议。
好的,刚刚发现消息的事件字段@OneToMany 注释中缺少 "cascade" 参数:
@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;
已解决!