我将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
策略但没有成功。