gpt4 book ai didi

java - 仅在某些记录上出现约束违规 spring JPA

转载 作者:搜寻专家 更新时间:2023-10-30 22:26:40 25 4
gpt4 key购买 nike

我收到依赖项实体的违反约束异常,但它只发生在旧记录上。我最后的更改是向名为 KPIBusiness 的父实体添加一个 mappedBy=kpi 属性。

我可以删除新创建的具有依赖关系的父实体,但不能删除旧的。

KPIBusiness.java:

@Entity
public class KPIBusiness extends KPI {

private Long businessProcessId;
private String businessProcess;

private Long eventId;
private String event;

@OneToMany(mappedBy="kpi", fetch = FetchType.EAGER, cascade=CascadeType.ALL)
private Set<Dependency> dependencies;
}

依赖.java

@Entity
@Table(name="dependencies")
public class Dependency {
@Id
@GeneratedValue
private Long did;

public Long getDid() {
return did;
}

public void setDid(Long did) {
this.did = did;
}
private AlertConstants.TRIGGER kpiType;

private Long kpiId;

@JsonIgnore
@ManyToOne
@JoinColumn(name="id", nullable=false)
private KPIBusiness kpi;
}

异常(exception):

Caused by: org.h2.jdbc.JdbcSQLException: Referentielle Integrität verletzt: "FKSKW30595DULXL90POB2K9KT3I: PUBLIC.KPIBUSINESS_DEPENDENCIES FOREIGN KEY(DEPENDENCIES_DID) REFERENCES PUBLIC.DEPENDENCIES(DID) (33)" Referential integrity constraint violation: "FKSKW30595DULXL90POB2K9KT3I: PUBLIC.KPIBUSINESS_DEPENDENCIES FOREIGN KEY(DEPENDENCIES_DID) REFERENCES PUBLIC.DEPENDENCIES(DID) (33)"; SQL statement: delete from dependencies where did=? [23503-196]

我正在使用这段代码:

repository.delete(currentKPI);
repository.flush();

现在我正在考虑使用这段代码:

currentKPI.setDependencies(new HashSet<Dependency>());
currentKPI = repository.save(currentKPI);
repository.flush();//HACK delete at first try
repository.delete(currentKPI);
repository.flush();

但是,currentKPI.setDependencies(dependencies); 似乎根本没有更新依赖项。我使用此代码尝试更改依赖项:

Set<Dependency> dependencies = new HashSet<Dependency>();
for(RemoteKPINames kpi : tcsDependencies.getValue()) {
Dependency dependency = new Dependency();
dependency.setKpiId(kpi.getId());
dependency.setKpiType(kpi.getType());
dependency.setKpi(data);
dependencies.add(dependency);
}

log.info("Setting dependencies in data object #={}", dependencies.size());
data.setDependencies(dependencies);

最佳答案

EmployeeEntity.java

@Entity
@Table(name = "Employee")
public class EmployeeEntity implements Serializable
{
private static final long serialVersionUID = -1798070786993154676L;
@Id
@Column(name = "ID", unique = true, nullable = false)
private Integer employeeId;
@Column(name = "FIRST_NAME", unique = false, nullable = false, length = 100)
private String firstName;
@Column(name = "LAST_NAME", unique = false, nullable = false, length = 100)
private String lastName;

@OneToMany(cascade=CascadeType.ALL, fetch = FetchType.LAZY)
@JoinColumn(name="EMPLOYEE_ID")
private Set<AccountEntity> accounts;

//Getters and Setters Ommited
}

AccountEntity.java

@Entity
@Table(name = "Account")
public class AccountEntity implements Serializable
{
private static final long serialVersionUID = 1L;
@Id
@Column(name = "ID", unique = true, nullable = false)
@GeneratedValue(strategy = GenerationType.SEQUENCE)
private Integer accountId;
@Column(name = "ACC_NO", unique = false, nullable = false, length = 100)
private String accountNumber;

@OneToOne (mappedBy="accounts", fetch = FetchType.LAZY)
private EmployeeEntity employee;

}

查看上面 EmployeeEntity.java 源代码中的粗体行。它定义了“cascade=CascadeType.ALL”,它本质上意味着在 EmployeeEntity 上发生的任何更改也必须级联到 AccountEntity。如果您保存一个员工,那么所有关联的帐户也将保存到数据库中。如果您删除员工,则与该员工关联的所有帐户也将被删除。很简单。

但是如果我们只想级联只保存操作而不是删除操作怎么办。然后我们需要使用下面的代码明确指定它。

@OneToMany(cascade=CascadeType.PERSIST, fetch = FetchType.LAZY)
@JoinColumn(name="EMPLOYEE_ID")
private Set<AccountEntity> accounts;

现在只有当使用员工实例调用 save() 或 persist() 方法时,才会只保留帐户。如果在 session 上调用任何其他方法,其效果不会影响/级联到帐户。

JPA 级联类型

Java Persistence Architecture 支持的级联类型如下:

  1. CascadeType.PERSIST :表示 save() 或 persist() 操作级联到相关实体。
  2. CascadeType.MERGE : 表示合并相关实体拥有实体合并。
  3. CascadeType.REFRESH :对 refresh() 做同样的事情操作。
  4. CascadeType.REMOVE : 删除所有关联的相关实体删除拥有实体时的此设置。
  5. CascadeType.DETACH :如果是“手动”,则分离所有相关实体分离”发生。
  6. CascadeType.ALL :是上述所有级联的简写运营。

关于java - 仅在某些记录上出现约束违规 spring JPA,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50599281/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com