2015-10-09 75 views
0

我在一對一關係中有以下類。在雙向OneToOne關係中刪除子實體

DrivingLicense.java 
@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; 
} 

Person.java 
@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) 
    private DrivingLicense drivingLicense; 
} 

現在,當我嘗試刪除駕駛執照的實體,然後它不是刪除它,我很困惑,如何刪除單獨駕駛執照?

entityManager.getTransaction().begin(); 

    DrivingLicense drivingLicense = entityManager.find(DrivingLicense.class, 6); 
    entityManager.remove(drivingLicense); 
    entityManager.getTransaction().commit(); 

更新

,而不是刪除空兩個選擇

Hibernate: select drivinglic0_.LICENSE_NUMBER as LICENSE_NUMBER1_0_0_, drivinglic0_.DATE_OF_ISSUE as DATE_OF_ISSUE2_0_0_, drivinglic0_.PERSON_ID as PERSON_ID3_0_0_, person1_.PERSON_ID as PERSON_ID1_1_1_, person1_.PERSON_NAME as PERSON_NAME2_1_1_ from DRIVING_LICENSE drivinglic0_ left outer join PERSON person1_ on drivinglic0_.PERSON_ID=person1_.PERSON_ID where drivinglic0_.LICENSE_NUMBER=? 
Hibernate: select drivinglic0_.LICENSE_NUMBER as LICENSE_NUMBER1_0_1_, drivinglic0_.DATE_OF_ISSUE as DATE_OF_ISSUE2_0_1_, drivinglic0_.PERSON_ID as PERSON_ID3_0_1_, person1_.PERSON_ID as PERSON_ID1_1_0_, person1_.PERSON_NAME as PERSON_NAME2_1_0_ from DRIVING_LICENSE drivinglic0_ left outer join PERSON person1_ on drivinglic0_.PERSON_ID=person1_.PERSON_ID where drivinglic0_.PERSON_ID=? 

其燒成爲什麼這些2個選擇被解僱?

回答

1

嘗試刪除drivingLicense從其各自Person第一:

entityManager.getTransaction().begin(); 

DrivingLicense drivingLicense = entityManager.find(DrivingLicense.class, 6); 

Person person = drivingLicense.getPerson(); 
person.setDrivingLicense(null); 
entityManager.merge(person); 

entityManager.remove(drivingLicense); 

entityManager.getTransaction().commit(); 
+0

是的,它的工作!你還可以補充說明這兩個選擇被解僱的原因嗎? – eatSleepCode

+0

我只能推測,但我認爲實體經理會檢查您想要刪除的駕駛執照的交叉引用(您的駕駛執照已被分配給的人員),以防止在沒有刪除駕駛執照時中斷您的數據庫參考完整性刪除相應的外鍵列值。 – Smutje

+0

我對這種關係的表設計有一個簡單的懷疑,'PERSON'表應該包含'DRIVING_LICENSE'或'DRIVING_LICENSE'的'fk'應該包含'PERSON'的'fk'嗎?兩者的優點和缺點是什麼? – eatSleepCode