6

私のチームには、JPAアノテーションによって関連付けられたUserとの2 つのクラスがあります。関連するコードは以下です。Store@ManyToMany

新しいUserオブジェクトを作成し、そのストアを設定するとき、人生は良いものです。しかし、Struts 2 / Spring Web UI を介して User オブジェクトを更新しようとすると、予期しない動作が発生します。(これらの問題は、JUnit を介して単純な自動統合テストを実行する場合には発生しません)。

簡単に言えば、 を保存するときUser、そのストア コレクションは更新されません。データベースは変更を表示せずUser、問題のオブジェクトをリロードすると、変更されていないストア セットがあることが示されます。

この問題に対して私たちが見つけた唯一の解決策は、この解決策が好きではありません。チームのすべての開発者を少しうんざりSetStoreuser.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);
4

3 に答える 3

7

問題は、双方向の関係があることです。この場合、もう一方を制御するエンティティが1つあり、マッピングから、制御するエンティティはUserではなくStoreエンティティであるため、ユーザーをストアに追加すると機能します(ストアは管理者であるため) ただし、ストアをユーザーに追加することはできません。

@ManyToMany(mappedBy = "users") アノテーションを getStores() メソッドに置き、getUsers() アノテーションを変更して、User オブジェクトを関係を制御するオブジェクトにすることで、状況を逆転させてみてください。

それが役に立ったことを願っています。

PS 関係を制御するエンティティは常に、mappedBy 属性を持たないエンティティです。

于 2010-01-20T21:07:29.003 に答える
2

同じ問題に行き詰まり、別のページで解決策を見つけました。

これが私のために働いたものです

マージを呼び出す前に getJpaTemplate().flush() を呼び出すとうまくいきました。

それが機能した理由がわかりませんでした。

于 2010-02-04T20:30:54.847 に答える