私のチームには、JPAアノテーションによって関連付けられたUser
との2 つのクラスがあります。関連するコードは以下です。Store
@ManyToMany
新しいUser
オブジェクトを作成し、そのストアを設定するとき、人生は良いものです。しかし、Struts 2 / Spring Web UI を介して User オブジェクトを更新しようとすると、予期しない動作が発生します。(これらの問題は、JUnit を介して単純な自動統合テストを実行する場合には発生しません)。
簡単に言えば、 を保存するときUser
、そのストア コレクションは更新されません。データベースは変更を表示せずUser
、問題のオブジェクトをリロードすると、変更されていないストア セットがあることが示されます。
この問題に対して私たちが見つけた唯一の解決策は、この解決策が好きではありません。チームのすべての開発者を少しうんざりSet
さStore
せuser.setStores(null)
ますuser.setStores(stores)
.
を使用していOpenEntityManagerInViewFilter
ます。JPAプロバイダーとしてHibernateを使用しています。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 の関連部分: (1 つまたは 2 つのレイヤーを通過してから:)
entity = getEntityManager().merge(entity);