在添加或删除属于另一个实体上的一对多集合(集合)的实体时,我正在努力解决性能问题。
我有适当的多对一反对关系集。
让我告诉你一些代码。这是Child
实体:
@Entity
@Access(AccessType.FIELD)
@Table(name = "child")
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
@BatchSize(size = 20)
public class Child {
@Id
@GeneratedValue(strategy = IDENTITY)
@Column(name = "dbid", unique = true, nullable = false)
private Integer id;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "parent1_id", nullable = true)
private Parent1 parent1;
/** Some other attributes, getters / setters **/
}
以下是Parent1
类:
@Entity
@DynamicUpdate(true)
@Access(AccessType.FIELD)
@Table(name = "parent1")
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
@BatchSize(size = 20)
public class Parent1 {
@Id
@GeneratedValue(strategy = IDENTITY)
@Column(name = "dbid", unique = true, nullable = false)
private Integer id;
@OneToMany(mappedBy = "parent1", fetch = FetchType.LAZY, cascade = CascadeType.REMOVE)
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
@BatchSize(size = 10)
private Set<Child> children = new HashSet<Child>();
/** Some other attributes, getters / setters **/
}
我目前正在使用EHCache。
目前,当我们创建属于Child
的{{1}}时,我们通过设置{{1}的Parent1
属性来维护(根据需要)关系的双方并将子项添加到parent1
集合。
这会导致整个Child
集合的获取,这是我们的性能瓶颈:
我的表现问题与this question非常相似,我认为接受的答案符合我的要求。通过一些改编(如何将集合从Hibernate 3改为4),至少在性能方面,它的效果非常好。
我仍然希望确保它不会弄乱二级缓存或其他任何,请记住,所做的只是内部交易 。
我们捕获由children
缓存策略(陈旧状态或陈旧对象异常,我猜这些是第一级缓存错误?)引起的潜在缓存错误,并在它们发生时执行回滚(这是当前预期的行为我们的应用程序),它似乎没有比第一级更破坏缓存。
在不久的将来,我们希望使用Infinispan进行完全事务处理(因此我们必须使用children
缓存并发策略)。
也就是说,正式地说,我的问题是:如果不收集具有这些约束的缓存中的集合,我怎么能在READ_WRITE
的{{1}}集合中添加/删除子集而不加载集合:< / p>
当然,我想知道为什么任何解决方案(来自上面的链接?)会带来这样的保证。
如果某些注释不是真的相关,请不要责怪我(如果是这样的话,请不要犹豫;)),这是我正在研究的遗留代码,我还在学习。也许我没有真正理解所有概念,如果需要,我会快速编辑我的问题。