根据这篇文章Difference between @OneToMany and @ElementCollection?,我希望@ElementCollection
用于可嵌入类型,@OneToMany
用于实体。但是使用@OneToMany
我可以另外设置选项orphanRemoval=true
。如何使用@ElementCollection
执行此操作?它意味着什么?
答案 0 :(得分:0)
暗示。删除拥有实体也会删除$ awk -F '|' 'NR==3{for(i=1;i<=NF;i++)printf("Column-%d = $%d = %s\n",i,i,$i)}' infile
Column-1 = $1 = a
Column-2 = $2 = 50
Column-3 = $3 = Need to improve
上的所有数据。如果@ElementCollection
尚未关闭,则Collection
设置为空或更改Collection
中的元素会导致更新。
官方文档here说明了这一点:
2.8.1。集合作为值类型
Value和embeddable类型集合具有类似的行为 简单的值类型,因为它们在自动持久化时 由持久对象引用并在自动删除时 未引用。如果集合从一个持久对象传递到 另外,它的元素可能会从一个表移动到另一个表。
...
对于值类型的集合,JPA 2.0定义了@ElementCollection 注解。 value-type集合的生命周期完全是 由其拥有的实体控制。
我运行了这三个测试来测试它:
Session
这是 @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(?, ?)
}
类:
Student