JPA @ManyToMany写入创建但不更新

Jim*_*ley 5 spring many-to-many jpa struts2

我的团队有两个类,User并且Store与JPA @ManyToMany注释相关.相关代码如下.

在创建新User对象并设置其商店时,生活是美好的.但是当我们尝试通过Struts 2/Spring Web UI更新User对象时,我们看到了一些意想不到的行为.(通过JUnit运行简单的自动化集成测试时不会出现这些问题).

简单地说,在保存时User,其商店集合不会更新 - 数据库显示没有更改,并且有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;
}
Run Code Online (Sandbox Code Playgroud)

Store.java的相关部分:

  @ManyToMany(mappedBy = "stores")
    public List<User> getUsers() {
        return users;
    }
Run Code Online (Sandbox Code Playgroud)

UserDetailAction.java的相关部分:(传递一层或两层,然后:)

entity = getEntityManager().merge(entity);
Run Code Online (Sandbox Code Playgroud)

Oma*_*bji 6

问题是你有一个双向关系,在这种情况下有一个实体控制另一个,从你的映射控制一个是商店实体而不是用户,所以添加用户到商店将工作(因为商店是控制的商店)但是向用户添加商店则不会.

通过在getStores()方法上放置@ManyToMany(mappedBy ="users")注释并更改getUsers(),可以尝试通过使User对象成为控制关系的对象来反转这种情况.

希望它有所帮助.

PS控制关系的实体始终是没有mappedBy属性的实体.


Kee*_*ter 1

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

@ManyToMany(cascade = {CascadeType.ALL})
Run Code Online (Sandbox Code Playgroud)