JPA多对多删除实体

时间:2018-09-06 08:33:47

标签: java hibernate jpa orm dao

我使用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 实体

1 个答案:

答案 0 :(得分:-1)

对于JPA而言,使用字符串构造查询SQL并不是一个好主意。应该使用JPQL或Criteria API。通常,关联的拥有方负责从联接表中删除行。对于双向关系,联接表中的行也可以从另一侧删除。这实际上取决于JPA的实现。据我了解, CMobileCom JPA 可以从两侧管理联接表。

免责声明:我是CMobileCom JPA的开发人员,这是一种适用于Android和Java JDBC的轻量级JPA实现。