【问题标题】:How to delete an object that is referenced from other objects?如何删除从其他对象引用的对象?
【发布时间】:2013-10-16 14:40:50
【问题描述】:

如何删除从其他对象引用的对象?示例:

Person person = new Person();
Payment payment = new Payment();
payment.setReceiverOfPayment(person);

dao.delete(person);

类:

class Person {

}

class Payment {
    //optional
    @OneToOne
    private Person receiverOfPayment;
}

现在,如果我删除对象 person,我会遇到异常:

org.hsqldb.HsqlException: integrity constraint violation: foreign key no action; 
FK_PAYMENT_RECEIVEROFPAYMENT_ID table: PAYMENT

这当然是因为某些付款可能仍然涉及人员。

在我删除一个人并手动清除引用之前,我是否必须在数据库中迭代我的所有付款?或者是否有任何级联(或类似)选项可以自动处理?

【问题讨论】:

  • 你没有双向关系,所以不能使用JPA的Cascade。
  • 如果要从 JPA 级联中获利,我必须对上述模型进行哪些更改?
  • @ManyToMany 到 List<Payment 可能有效,但 Cascade 是由应用程序代码生成的,而不是由数据库生成的。您将收到每次付款的更新请求(如果 FK 可以为空)。

标签: java database hibernate jakarta-ee jpa


【解决方案1】:

将支付字段添加到您的 Person 对象。您需要双向关系才能使用 Cascade。

类似这样的:

@Entity
public class Payment {
    @OneToOne(cascade = CascadeType.ALL)
    @JoinColumn(name="myColumn")
    private Person receiverOfPayment;
}

@Entity
public class Person {
    @OneToOne(mappedBy="receiverOfPayment")
    private Payment payment;
}

根据您的需求,ManyToOne 可能更相关。更多信息在Hibernate Documentation。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-16
    • 1970-01-01
    • 1970-01-01
    • 2022-01-16
    • 1970-01-01
    相关资源
    最近更新 更多