- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我收到依赖项实体的违反约束异常,但它只发生在旧记录上。我最后的更改是向名为 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 支持的级联类型如下:
关于java - 仅在某些记录上出现约束违规 spring JPA,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50599281/
与其说这是一个技术问题,不如说是一个政策问题。 开发应用程序时,如果附属机构提供的链接构成您内容的一部分,您是否可以显示该链接?例如,专门用于从 Affiliate Window 查找特定流派黑胶唱片
我是一名优秀的程序员,十分优秀!