6

我的团队有两个类,UserStore,由 JPA@ManyToMany注释相关。相关代码如下。

当创建一个新User对象并设置它的存储时,生活是美好的。但是当我们尝试通过我们的 Struts 2 / Spring web UI 更新用户对象时,我们看到了一些意外的行为。(通过 JUnit 运行简单的自动化集成测试时不会出现这些问题)。

简单地说,当保存 a 时User,它的 stores 集合没有更新——数据库没有显示任何变化,并且重新加载有User问题的对象表明它具有未更改的存储集。

对于这个问题,我们找到的唯一解决方案——我们不喜欢这个解决方案,它让我们团队中的所有开发人员都感到有些不安——是创建一个新SetStores,然后执行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);
4

3 回答 3

7

问题是您有一个双向关系,在这种情况下,有一个实体控制另一个实体,并且从您的映射中,控制实体是Store实体而不是User,因此将用户添加到商店将起作用(因为商店是控制者)但是向用户添加商店不会。

尝试颠倒这种情况,使 User 对象成为控制关系的对象,将 @ManyToMany(mappedBy = "users") 注释放在 getStores() 方法上并更改 getUsers() 之一。

希望它有所帮助。

PS控制关系的实体总是没有mappedBy属性的实体。

于 2010-01-20T21:07:29.003 回答
2

我只是遇到了同样的问题,并在另一个页面上找到了解决方案。

这对我有用

在调用合并之前调用 getJpaTemplate().flush() 对我有用。

我没有得到它工作的原因。

于 2010-02-04T20:30:54.847 回答
1

请在您的用户对象中尝试以下注释:

@ManyToMany(cascade = {CascadeType.ALL})
于 2009-06-03T21:16:17.087 回答