【发布时间】:2019-02-11 11:12:46
【问题描述】:
我使用 Hibernate(通过 JPA)。有一种删除实体的方法:
public void delete(final ID id) { entityManager.createQuery(String.format("delete from %s e where e.id = :id", entityClass.getSimpleName()))
.setParameter("id", id).executeUpdate();
}
我删除了实体(具有 many2many 关系):
休眠日志:
Hibernate: delete from author_to_book where (author_id) in (select id from author where id=?)
Hibernate: delete from author where id=?
谁负责从绑定表中删除关联?毕竟,我的代码仅指定从主表中删除。 它是如何工作的?
映射:
@Entity
public class Author extends BaseEntity implements IAuthor {
@Column
private String name;
@JoinTable(name = "author_to_book",
joinColumns = {@JoinColumn(name = "author_id")} ,
inverseJoinColumns = {@JoinColumn(name = "book_id")}
)
@ManyToMany(targetEntity = Book.class, fetch = FetchType.LAZY)
@OrderBy("title ASC")
private Set<IBook> books = new HashSet<>();
Book 实体没有到 Author 实体的映射
【问题讨论】:
-
为什么使用查询删除实体并忽略
em.remove?? Kinda 胜过使用持久性 API ... -
我在下面回答。我真的不明白它是如何工作的(em.remove -> 通过 Hibernate 实现)。因此,我问了关于删除实体的问题。
-
如果您不理解,请阅读您的 JPA 提供者的文档。
em.remove会处理所有的关系,批量删除查询不会(开发者负责)。但这就是 JPA 规范中的全部内容,因此建议您阅读它
标签: java hibernate jpa orm dao