我在从数据库中删除实体时遇到问题。无论我做什么,它都不会删除。
驱动程序类
@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
答案 0 :(得分:2)
看起来您的外键错误与根据您的代码行链接的客户端表相关:
@ManyToOne
@JoinColumn(name = "client_id")
private Client client;
因此,如果在注释中添加cascade = CascadeType.REMOVE,它可能会起作用。但是,如果您想要删除级联中的所有内容,包括客户端行,那么这取决于您。如果没有,则首先将该列值更新为null。