Hibernate缓存问题与一对多/多对一

时间:2014-09-11 13:27:25

标签: java hibernate caching jpa

我将hibernate / JPA与以下实体一起使用

Class User {
   @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
   @OneToMany(cascade = CascadeType.REMOVE)
   @JoinColumn(name = "user_id", insertable = false, updatable = false)
   @LazyCollection(LazyCollectionOption.EXTRA)
   private List<UserAcl> acl;

   ...
}

Class UserAcl {
   @ManyToOne(optional = false)
   @JoinColumn(name = "user_id")
   private User user;

   public void setUser(User user) {
      this.user = user;
   }

   ...
}

当我尝试通过执行以下代码添加新的UserAcl时:

UserAcl userAcl = new UserAcl();
userAcl.setUser(user);

em.persist(userAcl);

一秒钟之后(在其他交易中)我尝试检索之前的User,当我阅读UserAcl时,我没有看到新条目。

但如果我:

  • 等一下
  • 禁用缓存
在持久User之后

或刷新UserAcl

em.persist(userAcl);
em.refresh(user);

有效。

但刷新User有点棘手。我找到的另一个解决方案,除了禁用缓存,它将setUser方法调整为

public void setUser(User user) {
   user.getAcl().add(this);
   this.user = user;
}

但它是最好的解决方案吗?没有其他方法让Hibernate在不改变我的setter的情况下管理它?

PS:我尝试了没有@LazyCollection(LazyCollectionOption.EXTRA)或其他cascade策略但没有成功。

0 个答案:

没有答案