ayu*_*ush 1 java cascade cascading-deletes spring-data-jpa spring-boot
我有一个场景,其中策略和县实体表之间有一个多对多映射。这是实体代码-InsurancePolicy.java-
@Entity
@Table(name = "insurance_policy")
public class InsurancePolicy {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name="policy_id")
private long policyId;
@Column(name="policy_name",nullable = false,unique = true)
private String policyName;
//Short description
@Column(name="policy_description",nullable = false)
private String policyDescription;
//Long description
@Column(name="choose_description",nullable = false)
private String chooseDescription;
//many policies can belong to one category
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "company_id", nullable = false)
private Company company;
//many policies can belong to one category
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="category_id",nullable=false)
private Category category;
@ManyToMany(mappedBy = "queriedPolices",fetch = FetchType.LAZY,cascade = {CascadeType.DETACH, CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH})
private Set<User> usersQueried=new HashSet<>();
@OneToMany(mappedBy = "policy", cascade = {CascadeType.MERGE,CascadeType.PERSIST,CascadeType.REMOVE},fetch = FetchType.LAZY)
private Set<PolicyCounty> policyCounties = new HashSet<>();
Run Code Online (Sandbox Code Playgroud)
PolicyCounty.java-(关系表)
@Data
@Entity
@Table(name="policy_county")
public class PolicyCounty {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name="policy_county_id")
private long policyStateId;
@ManyToOne
@JoinColumn(name="policy_id")
private InsurancePolicy policy;
@ManyToOne
@JoinColumn(name = "county_id")
private County county;
@Column(name="cost",nullable = false)
private double cost;
}
Run Code Online (Sandbox Code Playgroud)
County.java-
@Entity
@Data
@Table(name="county")
public class County {
@Id
@Column(name="countyid")
@GeneratedValue(strategy = GenerationType.AUTO)
private long countyId;
@Column(name="countyname",nullable = false,unique = true)
private String countyName;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "adminId", nullable = false)
private Admin admin;
@OneToMany(mappedBy = "county", cascade = {CascadeType.MERGE,CascadeType.PERSIST},fetch = FetchType.LAZY)
private Set<PolicyCounty> policyStates = new HashSet<>();
}
Run Code Online (Sandbox Code Playgroud)
问题 -
我想删除InsurancePolicy实体,并删除 PolicyCounty 表中的相应实体。为此,我编写了删除方法 -
@Override
public long deletePolicy(long policyId) {
boolean isPresent=insurancePolicyRepository.existsById(policyId);
if(isPresent){
insurancePolicyRepository.deleteById(policyId);
return insurancePolicyRepository.count();
}
throw new ResourceNotFoundException("Policy with id "+policyId+" not found");
}
Run Code Online (Sandbox Code Playgroud)
现在,当我尝试删除时,实体不会从表中删除。在此操作过程中我没有遇到任何异常。我怀疑问题出在与实体一起使用的级联类型上。请帮助我理解这一点。
在您的代码中,您应该在 InsurancePolicy 中提交一个链接到县的文件
@ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.REMOVE)
@JoinTable(name = "policy_county",
joinColumns = @JoinColumn(name = "insurance_policy_id"),
inverseJoinColumns = @JoinColumn(name = "county_id"))
private Set<County> counties= new HashSet<>();
Run Code Online (Sandbox Code Playgroud)
你应该像这样在县提交申请
@ManyToMany(mappedBy = "insurance_policy", fetch = FetchType.LAZY)
private Set<InsurancePolicy > students = new HashSet<>();
Run Code Online (Sandbox Code Playgroud)
如果没有的话,hibernate 现在不会有多对多关系。
但是如果你的连接表中有额外的字段,比如成本字段,当你删除一个实体时,Hibernate不会自动从连接表中删除相应的条目。相反,您需要使用本机 SQL 查询或 Hibernate 的 Criteria API 手动删除连接表中的条目。
另一种选择是将多对多关系转换为 2 个一对多关系,如下所示:
public class Student {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "name")
private String name;
@OneToMany(mappedBy = "student", cascade = CascadeType.ALL, orphanRemoval = true)
private Set<Enrollment> enrollments = new HashSet<>();}
public class Course {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "name")
private String name;
@OneToMany(mappedBy = "course", cascade = CascadeType.ALL, orphanRemoval = true)
private Set<Enrollment> enrollments = new HashSet<>();}
public class Enrollment {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToOne(fetch = FetchType.LAZY)
private Student student;
@ManyToOne(fetch = FetchType.LAZY)
private Course course;
@Column(name = "cost")
private BigDecimal cost;}
Run Code Online (Sandbox Code Playgroud)
在上面的示例中,“学生”实体与“入学”实体具有一对多关系,“课程”实体也与“入学”实体具有一对多关系。这两种关系都使用 CascadeType.ALL 选项设置级联删除,这将导致在删除“学生”或“课程”实体时自动删除关联的“注册”实体。orphanRemoval 属性设置为 true,这将删除不再与“学生”或“课程”实体关联的任何“注册”实体。
设置级联删除后,您可以删除“学生”或“课程”实体,并且所有关联的“注册”实体将自动删除:
| 归档时间: |
|
| 查看次数: |
256 次 |
| 最近记录: |