1

Spring JPA Data を機能させようとしていますが、苦労しています。これが問題です。

単純な OneToMany 関係を持つ 2 つのドメイン クラスがあります。

class Card {
    @ManyToOne(mappedBy="user")
    private User user;
}

class User {
     @OneToMany
     private List<Card> cards;
}

各クラスのリポジトリ インターフェイスをセットアップしました: CardRepository、JpaRepository を拡張する UserRepository、両方のリポジトリがサービスに挿入されます。

@Service
@Transactional(readOnly = true)
class Service {
  @Autowired
  CardRepository repo1;
  @Autowired
  UserRepository repo2;

  public void someMethod() {
      // make use of the repos
      User u=repo2.findByIdentifier("ID1");
      List<Card> cards = u.getCards();
      //do something with the cards will throw lazyinitialization exception.
  }
}

かなり基本的な設定。問題は someMethod() に付属しており、ユーザーにその識別子を照会し、マップされた @OneToMany のリストを取得しようとすると、LazyInitialization 例外が発生しました。

そこに何かを逃したかどうかはよくわかりませんか?リポジトリのメソッドが返される限り、entitymanager は閉じられているようです。その場合、別のリポジトリ メソッドを定義せずに関係を取得するにはどうすればよいでしょうか。

ただし、@OneToMany のフェッチを熱心に設定しても問題ありませんが、それは私が本当にやりたくないことです。

リポジトリの delete() も問題があるようです。最初にカードを削除してから、所有しているユーザー (まだリストにカードがある) を delete() しようとすると、カードが見つからないという不平を言って削除が失敗します。しかし、ユーザーからカードへの削除の伝播を設定しませんでした!

JpaRepository で entitymanager がどのように使用されているかを誰かが説明できることを願っています。Jpa プログラミングがより難しくなっているようです。すべてのリポジトリが自動的に生成されることは知っていますが、それらがどのように実装されているかを誰かが指摘できれば、非常に役立ちます。

ありがとう。ウードン

4

1 に答える 1

0

まず、マッピング タグを交換する必要があります。

class User(){
 @OneToMany(mappedBy="user")
 private List<Card> cards;
}

class Card{
@ManyToOne
private User user;
}

そして、あなたはsomeMethodをどのように呼び出していますか? init メソッドで呼び出すと、 @Transactionalを使用できなくなります

于 2012-06-14T05:13:18.437 に答える