有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

mysql Java JPA/Hibernate级联删除

我正在使用Java8JPAHibernate 5.2.1.FinalSpring 4.3.1.RELEASEMySQL

表:

如您所见,我有一个job表连接到了一个location_job表,它利用了连接表job_location

+---------+         +--------------+        +---------------+
|   job   |         | job_location |        |  location_job |
+---------+         +--------------+        +---------------+
|   ID    |         |   JOB_ID     |        |     ID        |
|         |         |   LOC_ID     |        |     LAT       |
|         |         |              |        |     LONG      |
+---------+         +--------------+        +---------------+

我正在对job表执行delete,还想删除job_locationlocation_job表上的相应条目

代码:

目前,我的代码成功地从jobjob_location表中删除,但没有从location_job表中删除相应的条目

工作。java

@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JoinTable(name = "job_location", joinColumns = {
        @JoinColumn(name = "JOB_ID", referencedColumnName = "ID") }, inverseJoinColumns = {
                @JoinColumn(name = "LOC_ID", referencedColumnName = "ID", unique = true) })
private Set<LocationJob> locations;

JobDaoImpl。java

@Repository("jobDao")
public class JobDaoImpl extends JpaDao<Long, Job> implements JobDao {

    @Override
    public boolean delete(Job job) {
        Set<LocationJob> locations = job.getLocations();
        if (locations != null) {
            for (LocationJob location : locations) {
                entityManager.remove(location);
            }
            job.getLocations().clear();
        }       
        entityManager.remove(job);
        return true;
    }
}

JpaDao。java

public class JpaDao<I, T extends AbstractDomain<I>> {

    protected Class<T> entityClass;

    @PersistenceContext
    protected EntityManager entityManager;

    @SuppressWarnings("unchecked")
    protected JpaDao() {
        ParameterizedType genericSuperclass = (ParameterizedType) getClass().getGenericSuperclass();
        this.entityClass = (Class<T>) genericSuperclass.getActualTypeArguments()[1];
    }

    protected void remove(T entity) {
        entityManager.remove(entity);
    }
}

问题

当我从job表中删除时,如何使它也从location_job表中删除

多谢各位


共 (1) 个答案

  1. # 1 楼答案

    我找到了答案

    我需要添加orphanRemoval=true

    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, orphanRemoval=true)
    @JoinTable(name = "job_location", joinColumns = {
            @JoinColumn(name = "JOB_ID", referencedColumnName = "ID") }, inverseJoinColumns = {
                    @JoinColumn(name = "LOC_ID", referencedColumnName = "ID", unique = true) })
    private Set<LocationJob> locations;