我的团队有两个类,User
和Store
,由 JPA@ManyToMany
注释相关。相关代码如下。
当创建一个新User
对象并设置它的存储时,生活是美好的。但是当我们尝试通过我们的 Struts 2 / Spring web UI 更新用户对象时,我们看到了一些意外的行为。(通过 JUnit 运行简单的自动化集成测试时不会出现这些问题)。
简单地说,当保存 a 时User
,它的 stores 集合没有更新——数据库没有显示任何变化,并且重新加载有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);