ホーム>source

私のウィズウィズクラスは次のようになります。

<前>ウィズウィズ

そして私の User このようなクラス:

<前>ウィズウィズ

そして私の @Data @Entity public class User { @Id Long userID; @ManyToMany(mappedBy = "admins") private List<ClassRoom> classRooms = new ArrayList<>(); } クラス、私は持っています:

<前>ウィズウィズ

そして私役職 そして空JSON ( ClassRoom )、ユーザーに変化はありません。ウィズウィズまたは空の @Data @Entity public class ClassRoom { @Id @GeneratedValue(strategy = GenerationType.AUTO) Long classRoomID; @ManyToMany @JoinTable(name ="classroom_user", joinColumns = @JoinColumn(name = "classroom_id"), inverseJoinColumns = @JoinColumn(name = "user_id")) private List<User> admins = new ArrayList<>(); } UserController に追加されない 。

ここの問題は何ですか?どうすればこれを解決できますか?

@PostMapping("user/{id}/c") User addClassRoom(@PathVariable Long id,@RequestBody ClassRoom newClassRoom) { logger.debug(repository.findById(id)); return repository.findById(id) .map(user -> { user.getClassRooms().add(newClassRoom); user.setClassRooms(user.getClassRooms()); return repository.save(user); }) .orElseGet(() -> { return null; }); }
あなたの答え
  • 解決した方法 # 1

    ウィズウィズ   user.getClassRooms().add(newClassRoom); で十分です  必要ありません。

    カスケード保存操作を実行する必要があります。すべてのカスケードタイプを明示的にリストし、mapedByを使用せず、代わりにjoincolumnsアノテーションを使用してください。

  • 解決した方法 # 2

    ログを貼り付けてもらえますか? Hibernateはテーブルへの挿入を行っていますか?データベーススキーマはDBに正しく作成されていますか?私がお勧めすることの1つは、@ Table(name = "users")のようなアノテーションを使用して、Userクラスの最上部にカスタムテーブル名を追加することです。ほとんどのSQL方言では、userは予約済みキーワードであるため、常にUserクラスに少し異なるアノテーションを付けることをお勧めします。これにより、Hibernateがそのエンティティのテーブルを作成する際に問題が発生しなくなります。

  • 解決した方法 # 3

    IMOリポジトリからidでclassRoomを検索する必要があります。新しい場合は、新しいエンティティを作成して最初に保存する必要があります。次に、それをユーザーに割り当てて保存します。 postメソッドから受け取るオブジェクトは、エンティティマネージャーによって作成されたものではありません。

  • 解決した方法 # 4

    user.setClassRooms(user.getClassRooms()); を使用した後  

    我々しなければならない  user.getClassRooms().add(newClassRoom); を使用する

    userRepository.save(user);

関連記事

  • 前へ java - JPAクエリ:サブクエリをグループ化条件に結合する
  • 次へ redhat - yumのインストールに失敗しましたi686 x86_64