この投稿によるとDifference between @OneToMany and @ElementCollection?埋め込み可能なタイプの場合は@ElementCollection
、エンティティの場合は@OneToMany
が好ましいはずです。しかし、@OneToMany
を使用すると、オプションorphanRemoval=true
を追加設定できます。 @ElementCollection
でどうすればいいですか?それはどういう意味ですか?@ ElementCollectionはorphanRemovalを意味しますか?
1
A
答えて
0
これは暗示されています。所有エンティティを削除すると、@ElementCollection
のすべてのデータも削除されます。 Collection
をヌルに設定するかCollection
の要素を変更すると、Session
がまだ閉じていなければ更新が行われます。
公式ドキュメントhereはこれを言う:
2.8.1。彼らは 永続オブジェクトが参照するときに自動的に持続し、自動的に削除されるため、値型
値と、埋め込み型のコレクションとしてコレクションが シンプルな値型と同様の動作をしたときに 参照されていません。 1つのコレクションが1つの永続オブジェクトから別のグループに に渡された場合、その要素はあるテーブルから別のテーブルに移動される可能性があります。
...
JPA 2.0は、値タイプのコレクションの場合、@ ElementCollection アノテーションを定義します。 value-typeコレクションのライフサイクルは、所有エンティティによって完全に制御されます( )。
私はそれをテストするために、これらの3つのテスト実行しました:これはStudent
クラスです
@Test
public void selectStudentAndSetBooksCollectionToNull() {
Student student = studentDao.getById(3L);
List<String> books = student.getBooks();
books.forEach(System.out::println);
student.setBooks(null);
em.flush(); // delete from student_book where student_id = ?
}
@Test
public void selectStudentAndAddBookInCollection() {
Student student = studentDao.getById(3L);
List<String> books = student.getBooks();
books.add("PHP Book");
books.forEach(System.out::println);
em.flush(); // insert into student_book(student_id, book) values(?, ?)
}
@Test
public void selectStudentAndChangeCollection() {
Student student = studentDao.getById(3L);
List<String> newBooks = new ArrayList<>();
newBooks.add("Rocket Engineering");
newBooks.forEach(System.out::println);
student.setBooks(newBooks);
em.flush(); // delete from student_book where student_id = ?
// insert into student_book(student_id, book) values(?, ?)
}
を:
@Entity
@Table(name = "student")
public class Student {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "student_id", nullable = false, insertable = false, updatable = false)
private Long id;
@Column(name = "name", nullable = false)
private String name;
@ElementCollection
@CollectionTable(
name = "student_books",
joinColumns = @JoinColumn(name = "student_id", referencedColumnName = "student_id"))
@Column(name = "book")
private List<String> books = new ArrayList<>();
// Getters & Setters
}
関連する問題
- 1. Bash: '$(())'は 'expr'を意味し、 '[]'は 'テスト'を意味しますか?
- 2. 意味論は何を意味しますか?
- 3. 「===」はJavascript/Jqueryを意味しますか?
- 4. IndexOutofRangeExceptionは何を意味しますか?
- 5. !viは何を意味しますか?
- 6. {login}は何を意味しますか
- 7. force_reloadは何を意味しますか?
- 8. コンパイラは何を意味しますか?
- 9. (+ var)は何を意味しますか
- 10. getActivity()は何を意味しますか?
- 11. タイプ `*`は__vfptrを意味しますか?
- 12. グローバルステップは何を意味しますか?
- 13. "="は何を意味しますか
- 14. エラーメッセージは何を意味しますか?
- 15. *は何を意味しますか?
- 16. new()は何を意味しますか?
- 17. {}は何を意味しますか?
- 18. バックスラッシュは何を意味しますか?
- 19. "flex:..."は "display:flex"を意味しますか?
- 20. Failed_Reason_Other_Than_A_Connection_Already_Existsは何を意味しますか?
- 21. ^は何を意味しますか?
- 22. .html()は何を意味しますか?
- 23. node()| @ *はXSLTを意味しますか?
- 24. javascript:voidは何を意味しますか?
- 25. UnmappableCharacterExceptionは何を意味しますか?
- 26. フラットは何を意味しますか?
- 27. 「ネットワークパフォーマンス」は何を意味しますか?
- 28. Sortは-fを意味しますか?
- 29. HttpServletResponse.SC_BAD_REQUESTは意味しますか?
- 30. NSDecimalAdd() - constの意味は何を意味するのですか?
しかし、それはorphanRemovalがすべてに約あるではありません。もちろん、親を削除した場合、子供はカスケードの方法で削除されますが、それがもはや利用できないように参照を失うだけの場合(たとえば、nullに設定することによって)、子供にはどうなりますか? –
はい、 '@ ElementCollection'フィールドには暗黙のうちに' Cascasde.ALL' + 'orphanRemoval = true' –