簡體   English   中英

Java JPA / Hibernate級聯刪除

[英]Java JPA/Hibernate cascade delete

我正在使用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表上執行刪除操作,並且還想刪除job_locationlocation_job表上的相應條目。

碼:

目前,我的代碼已成功從jobjob_location表中刪除,但沒有從location_job表中刪除相應的條目。

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表中刪除?

謝謝。

我在這里找到了答案。

我需要添加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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM