java - JPA - 删除时出现 ConstraintViolationException

标签 java mysql hibernate spring-mvc jpa

我在网上搜索,尝试了很多方法,但在删除过程中仍然遇到问题。请给我任何指示,因为我想了解我做错了什么。

我有几个实体,但简而言之:

public class PetOwner extends User {
    private String address;
    private String telefon;

    @OneToMany(cascade={CascadeType.REMOVE})
    private List<Appointment> appointments;
}


public class Appointment {
    @Id
    @GeneratedValue
    private long id;

    @ManyToOne(cascade={CascadeType.PERSIST})
    @JoinColumn(name = "owner_id")
    private PetOwner petOwner;
}

当我尝试使用此方法(JpaRepository)删除约会时

@Transactional
    public void delete(Appointment appointment){
        appointmentRepository.delete(appointment);
    }

Spring 抛出异常:

MySQLIntegrityConstraintViolationException: Cannot delete or update a parent row: a foreign key constraint fails

唯一的方法是在 Appointment.class 中设置

@ManyToOne(cascade={CascadeType.ALL})
    @JoinColumn(name = "owner_id")
    private PetOwner petOwner;

但随后除了 session 还删除了 PetOwner。请指导如何处理。

最佳答案

如果不参与关于创建层次结构以反射(reflect)属性(而非自然)的争论,您可以在此处使用两种方法。

首先,您可以更好地书写您的人际关系。我不知道您选择的 JPA 实现是什么,但有时它们会弄乱表格,从而创建不必要的链接表格。所以,安全总比后悔好:

在 PetOwner 上,使用:

@OneToMany(cascade={CascadeType.REMOVE}, mappedBy="petOwner")
private List<Appointment> appointments;

第二种方法是明确表示您的所有者在移除之前没有预约,因此:

@Transactional
public void delete(Appointment appointment){
    appointment.getPetOwner().getAppointments().remove(appointment);
    appointmentRepository.delete(appointment);
}

这真的很糟糕,因为当所有者有很多约会时,您可能会遇到巨大的性能问题。

关于java - JPA - 删除时出现 ConstraintViolationException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35527127/

相关文章:

hibernate - 如何配置 Spring Boot 应用程序以使用 aspectj 事务?

mysql - 使用带有自定义列的选择插入多行

php - MySQL - 计算左连接没有性能

java - hibernate 异常 : Access to DialectResolutionInfo cannot be null when 'hibernate.dialect' not set

java - 如何在没有互联网的情况下获取 phonegap 中的地理位置?

mysql - 加入MYSQL查询问题

java - OptimisticLockException 之后重试方法时出错 - org.postgresql.util.PSQLException : This statement has been closed

java - 如何在java中创建带有多个可选where子句的搜索语句?

java - 层之间枚举的映射

java - HTTP Get - Python 与 Spring Rest 模板