Spring数据JPA不删除实体

时间:2017-09-13 08:03:37

标签: java spring postgresql spring-data-jpa

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

驱动程序类

@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 ...
}

首先我要做的是使用ratings注释@OneToMany(mappedBy = "driver", fetch = FetchType.EAGER, orphanRemoval = true, cascade = CascadeType.REMOVE),并在调用driverRepository.delete(driver)时抛出:

  

org.postgresql.util.PSQLException:错误:表“驱动程序”上的更新或删除违反了“评级”表中的外键约束“fk3raf3d9ucm571r485t8e7ew83”

好的,选择另一种方式。尝试使用ratingRepository删除每个评级对象,但永远不会发生,它只是遍历每个评级项并再次抛出错误

  

org.postgresql.util.PSQLException

下一步是将每个评级项客户端驱动程序设置为null。现在,驱动程序实体已从数据库中删除,但评级实体仍保留在数 会发生什么?

Spring Data JPA 版本: 1.5.7

1 个答案:

答案 0 :(得分:2)

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

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

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