我有两个实体,其中一个实体与第二个实体具有manyToOne关系
实体1:
@Entity
@Table(name = "chilling_unit")
@Data
@NoArgsConstructor
public class ChillingUnitMonitoringDetailsDAO<T> {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
private Long id;
@Column(name="edge_controller_serial_number",nullable = false)
private String l3SerialNumber;
@Column(name = "product_type_name")
private String productType;
@ManyToOne(fetch = FetchType.EAGER, optional = false,cascade = javax.persistence.CascadeType.ALL
@JoinColumn(name = "location_id")
@OnDelete(action = OnDeleteAction.CASCADE)
@JsonIgnore
@EqualsAndHashCode.Exclude
private LocationDAO location;
}
和实体2:
@Entity
@Table(name = "location")
@Data
@NoArgsConstructor
public class LocationDAO {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
private Long id;
@Column(name = "location_id",unique = true)
private String locId;
}
但是,每当我尝试使用JPA respository执行delete命令时,即deleteById(id)
,该操作将同时删除chlllingUnitMonitoringDetails和location
但是它应该只删除chlllingUnitMonitoringDetails行,而不是位置,谁能告诉我为什么位置也被删除了??
如何防止这种情况??
public interface ChillingUnitMonitoringRepository<T> extends JpaRepository<ChillingUnitMonitoringDetailsDAO<T>,Long> {
}
发布于 2019-09-06 10:49:34
上面有@OnDelete(action = OnDeleteAction.CASCADE)
注释。这意味着“在删除ChillingUnitMonitoringDetailsDAO
的同时,也删除LocationDAO
”。
我建议您对级联类型做一些研究。您可以从这里开始:https://www.baeldung.com/jpa-cascade-types
如果Location
字段上方有cascade = javax.persistence.CascadeType.ALL
或cascade = javax.persistence.CascadeType.REMOVE
,则删除操作也将级联。
发布于 2019-09-06 10:45:43
只要删除行@OnDelete(action = OnDeleteAction.CASCADE)
即可。
发布于 2019-09-06 12:45:03
您应该删除级联。
@ManyToOne(fetch = FetchType.EAGER,optional = false) @JoinColumn(name = "location_id")
@JsonIgnore @EqualsAndHashCode.Exclude私有LocationDAO位置;
https://stackoverflow.com/questions/57820394
复制相似问题