【问题标题】:delete child entity in bidirectional OneToOne relationship删除双向 OneToOne 关系中的子实体
【发布时间】:2015-10-09 04:50:24
【问题描述】:

我在一对一关系中有以下课程。

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 个选择会被触发?

【问题讨论】:

    标签: hibernate jpa one-to-one


    【解决方案1】:

    首先尝试从其各自的Person 中删除drivingLicense

    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();
    

    【讨论】:

    • 是的,成功了!!您能否还添加这两个选择被触发的原因?
    • 我只能推测,但我认为实体经理会检查您要删除的驾驶执照(您的驾驶执照被分配给的人)的交叉引用,以防止破坏您的数据库引用删除驾驶执照而不删除相应的外键列值时的完整性。
    • 我对带有这种关系的表格设计有一个简单的疑问,PERSON 表格是否应该包含DRIVING_LICENSEfkDRIVING_LICENSE 应该包含@987654330 的fk @?两者的优缺点是什么?
    • 你的问题的答案,为什么它会触发两次选择,是here
    猜你喜欢
    • 1970-01-01
    • 2019-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多