2015-10-09 54 views
0

牽強我不能夠刪除相關的實體實例牽強使用查詢相關的實體,我有以下類無法刪除使用查詢

@Entity 
@Table(name = "PERSON") 
public class Person { 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    @Column(name = "PERSON_ID") 
    private int personId; 
    @Column(name = "PERSON_NAME", nullable = false, length = 30) 
    private String personName; 

    @OneToOne(mappedBy = "person", cascade = CascadeType.ALL) 
    //@Fetch(FetchMode.JOIN) 
    private DrivingLicense drivingLicense; 
} 

@Entity 
@Table(name = "DRIVING_LICENSE") 
public class DrivingLicense { 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    @Column(name = "LICENSE_NUMBER") 
    private int licenseNumber; 
    @Column(name = "DATE_OF_ISSUE") 
    private Date dateOfIssue; 

    @OneToOne 
    @JoinColumn(name = "PERSON_ID") 
    private Person person; 
} 

,我試圖刪除像

entityManager.getTransaction().begin(); 

List<Person> resultList = entityManager.createQuery("from Person p join fetch p.drivingLicense", Person.class).getResultList(); 
resultList.forEach(person -> System.out.println(person.getDrivingLicense().getDateOfIssue())); 

DrivingLicense drivingLicense = resultList.get(0).getDrivingLicense(); 
System.out.println(drivingLicense.getLicenseNumber()); 
entityManager.remove(drivingLicense); 


entityManager.getTransaction().commit(); 

我認爲它會刪除DrivingLicense,但不會刪除它。當我試圖通過使用entityManager.remove(resultList.get(0))刪除Person時,它隨DriverLicense一起刪除了該人。

我得到它是如何工作的?爲什麼DrivingLIcense沒有被刪除?

+0

我得到了它的原因。它沒有被刪除,因爲Person引用仍然指的是DrivingLicense Reference,它不會讓它被刪除,所以當引用被設置爲null時它就起作用了! – eatSleepCode

回答

1

也許,您正在收到參照完整性約束錯誤,因爲您沒有更新雙向關聯的另一側。

嘗試去除實體之前更新引用:

Person person = resultList.get(0); 
DrivingLicense drivingLicense = person.getDrivingLicense(); 
drivingLicense.setPerson(null); 
person.setDrivingLicense(null); 
entityManager.merge(person); 
entityManager.remove(entityManager.merge(drivingLicense)); 
+0

你是對的!這是唯一的原因,我也在我的評論中更新了它。 – eatSleepCode

+0

啊!你在我發佈答案之前發表了評論:)無論如何,很高興它現在正在工作。 – Ish