【问题标题】:Spring data JPA doesn't delete entitySpring data JPA 不会删除实体
【发布时间】:2017-09-13 08:03:36
【问题描述】:

我在从数据库中删除实体时遇到问题。不管我做什么,它都不会删除。

驱动类

@Entity
@Table(name = "drivers")
public class Driver {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @OneToMany(mappedBy = "driver", fetch = FetchType.EAGER)
    @JsonSerialize(using = RatingsSerializer.class)
    private List<Rating> ratings;

    // other fields. Getters and Setters...
}

评级等级

@Entity
@Table(name = "ratings")
@JsonDeserialize(using = RatingDeserializer.class)
public class Rating {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @ManyToOne
    @JoinColumn(name = "driver_id")
    private Driver driver;

    @ManyToOne
    @JoinColumn(name = "client_id")
    private Client client;
    private int mark;
    private Date createdAt;

    //Getters and Setters ...
}

我所做的第一个是用@OneToMany(mappedBy = "driver", fetch = FetchType.EAGER, orphanRemoval = true, cascade = CascadeType.REMOVE) 注释ratings,当调用driverRepository.delete(driver) 时它会抛出:

org.postgresql.util.PSQLException:错误:更新或删除表“drivers”违反了表“ratings”上的外键约束“fk3raf3d9ucm571r485t8e7ew83”

好的,选择其他方式。尝试使用ratingRepository 删除每个评分对象,但从未发生过,它只是遍历每个评分项并再次抛出错误

org.postgresql.util.PSQLException

下一步是将每个评级项目 ClientDriver 设置为 null。现在驾驶员实体已从数据库中删除,但评级实体仍保留在数据库中。 会发生什么?

Spring Data JPA 版本:1.5.7

【问题讨论】:

    标签: java spring postgresql spring-data-jpa


    【解决方案1】:

    看起来您的外键错误与根据您的代码行链接的客户端表有关:

    @ManyToOne
    @JoinColumn(name = "client_id")
    private Client client;
    

    因此,如果您在注释中添加 cascade = CascadeType.REMOVE,它可能会起作用。但是,如果您想删除级联上的所有内容,包括客户端行,这取决于您。如果不是,则先将该列值更新为 null。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-03
      • 2018-12-03
      • 2020-10-19
      • 2019-09-30
      • 2019-08-14
      • 2015-07-10
      • 2015-09-11
      • 1970-01-01
      相关资源
      最近更新 更多