我的团队有两个类(class),User
和 Store
, JPA 相关 @ManyToMany
注释。相关代码如下。
创建新时User
物以类聚,生活美好。但是当我们尝试通过 Struts 2/Spring Web UI 更新 User 对象时,我们看到了一些意外行为。 (通过 JUnit 运行简单的自动化集成测试时不会出现这些问题)。
简单地说,保存 User
时,它的商店集合没有更新——数据库显示没有变化,并重新加载 User
有问题的对象显示它具有一组未更改的商店。
我们为这个问题找到的唯一解决方案——我们不喜欢这个解决方案,它让我们团队中的所有开发人员都有点不安——是创建一个新的 Set
的 Store
s,然后做 user.setStores(null)
,然后做 user.setStores(stores)
.
我们正在使用 OpenEntityManagerInViewFilter
;我们使用 Hibernate 作为我们的 JPA 提供者;我们正在使用 Spring 的 JpaTransactionManager。我们没有 @Transactional
我们代码中的注释——并添加它们会由于其他地方描述的代理行为而破坏现有代码。
欢迎任何人就我们如何以一种不烦躁的方式解决这个问题提供任何见解。
User.java 的相关部分:
@ManyToMany
@JoinTable(name = "company.user_store_access",
joinColumns = @JoinColumn(name = "userid"),
inverseJoinColumns = @JoinColumn(name = "storeid"))
public Set<Store> getStores() {
return stores;
}
Store.java 的相关部分:
@ManyToMany(mappedBy = "stores")
public List<User> getUsers() {
return users;
}
UserDetailAction.java 的相关部分:
(向下传递一两层,然后:)
entity = getEntityManager().merge(entity);
最佳答案
问题是你有一个双向关系,在这种情况下有一个实体控制另一个,从你的映射中控制一个是 店铺 实体而不是 用户 ,因此将用户添加到商店会起作用(因为商店是控制者)但将商店添加到用户不会。
尝试反转情况,通过将 User 对象设置为控制关系的对象,将 @ManyToMany(mappedBy = "users") 注释放在 getStores() 方法上并更改 getUsers() 方法。
希望它有所帮助。
附言控制关系的实体始终是没有mappedBy 属性的实体。
关于spring - JPA @ManyToMany 写在创建但不更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/946938/