Java持久性:无法添加或更新子行:外键约束失败
基本上,我正在实现一个PDS(个人数据表),所以我有一些表,比如客户(员工)、个人信息、其他信息 客户端表结构:Java持久性:无法添加或更新子行:外键约束失败,java,mysql,jpa,Java,Mysql,Jpa,基本上,我正在实现一个PDS(个人数据表),所以我有一些表,比如客户(员工)、个人信息、其他信息 客户端表结构: idClients, name, institute, username, password, usertype idPersonalInfo, agencyno, bloodtype, status, citizenship, address, idClients Personalinfo表结构: idClients, name, institute, username, pa
idClients, name, institute, username, password, usertype
idPersonalInfo, agencyno, bloodtype, status, citizenship, address, idClients
Personalinfo表结构:
idClients, name, institute, username, password, usertype
idPersonalInfo, agencyno, bloodtype, status, citizenship, address, idClients
我可以成功添加客户端,但当我尝试添加/更新personalinfo时,我会
MySQLIntegrityConstraintViolationException: Cannot add or update a child row: a foreign key constraint fails
在personalinfo类中,我还有一行:
@JoinColumn(name = "idClients", referencedColumnName = "idClients", insertable = false, updatable = false)
在客户类别I中,还包括:
@OneToOne(cascade = CascadeType.ALL, mappedBy = "clients")
private Personalinfo personalinfo;
但我不明白为什么我会违反约束
Error Code: 1452
Call: INSERT INTO personalinfo (...) VALUES (...)
bind => [7parameters bound]
Query: InsertObjectQuery(com.profiling.database.Personalinfo[ idPersonalInfo=null ])
编辑:
编辑
客户端类:
@Entity
@Table(name = "clients")
@XmlRootElement
@NamedQueries({
@NamedQuery(name = "Clients.findAll", query = "SELECT c FROM Clients c"),
@NamedQuery(name = "Clients.findByIdClients", query = "SELECT c FROM Clients c WHERE c.idClients = :idClients"),
@NamedQuery(name = "Clients.findByFirstName", query = "SELECT c FROM Clients c WHERE c.firstName = :firstName"),
@NamedQuery(name = "Clients.findByGender", query = "SELECT c FROM Clients c WHERE c.gender = :gender"),
@NamedQuery(name = "Clients.findByLastName", query = "SELECT c FROM Clients c WHERE c.lastName = :lastName"),
@NamedQuery(name = "Clients.findByMiddlename", query = "SELECT c FROM Clients c WHERE c.middlename = :middlename"),
@NamedQuery(name = "Clients.findByNameExtension", query = "SELECT c FROM Clients c WHERE c.nameExtension = :nameExtension")})
public class Clients implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "idClients")
private Integer idClients;
@Column(name = "FirstName")
private String firstName;
@Column(name = "Gender")
private String gender;
@Column(name = "LastName")
private String lastName;
@Column(name = "Middlename")
private String middlename;
@Column(name = "NameExtension")
private String nameExtension;
@Column(name = "Institute")
private String institute;
//value added
@Column(name = "username")
private String username;
@Column(name = "password")
private String password;
@Column(name = "userType")
private String userType;
@OneToMany(mappedBy = "idClients")
private List<Workexpe> workexpeList;
@OneToMany(mappedBy = "idClients")
private List<Ratingscore> ratingscoreList;
@OneToOne(cascade = CascadeType.ALL, mappedBy = "clients")
private Familyback familyback;
@OneToMany(mappedBy = "idClients")
private List<Civilservice> civilserviceList;
@OneToMany(mappedBy = "idClients")
private List<Staffscore> staffscoreList;
@OneToMany(mappedBy = "idClients")
private List<Referenceinfo> referenceinfoList;
@OneToOne(cascade = CascadeType.ALL, mappedBy = "clients")
private Personalinfo personalinfo;
@OneToOne(cascade = CascadeType.ALL, mappedBy = "clients")
// @OneToOne(mappedBy = "idClients")
private Otherinfo otherinfo;
@OneToMany(mappedBy = "idClients")
private List<Trainingprog> trainingprogList;
@OneToMany(mappedBy = "idClients")
private List<Children> childrenList;
@OneToMany(mappedBy = "idClients")
private List<Specialskills> specialskillsList;
@OneToMany(mappedBy = "idClients")
private List<Educback> educbackList;
@OneToMany(mappedBy = "idClients")
private List<Voluntarywork> voluntaryworkList;
public Clients() {
}
public Clients(Integer idClients) {
this.idClients = idClients;
}
public Integer getIdClients() {
return idClients;
}
public void setIdClients(Integer idClients) {
this.idClients = idClients;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String getMiddlename() {
return middlename;
}
public void setMiddlename(String middlename) {
this.middlename = middlename;
}
public String getNameExtension() {
return nameExtension;
}
public void setNameExtension(String nameExtension) {
this.nameExtension = nameExtension;
}
@XmlTransient
public List<Workexpe> getWorkexpeList() {
return workexpeList;
}
public void setWorkexpeList(List<Workexpe> workexpeList) {
this.workexpeList = workexpeList;
}
@XmlTransient
public List<Ratingscore> getRatingscoreList() {
return ratingscoreList;
}
public void setRatingscoreList(List<Ratingscore> ratingscoreList) {
this.ratingscoreList = ratingscoreList;
}
public Familyback getFamilyback() {
return familyback;
}
public void setFamilyback(Familyback familyback) {
this.familyback = familyback;
}
@XmlTransient
public List<Civilservice> getCivilserviceList() {
return civilserviceList;
}
public void setCivilserviceList(List<Civilservice> civilserviceList) {
this.civilserviceList = civilserviceList;
}
@XmlTransient
public List<Staffscore> getStaffscoreList() {
return staffscoreList;
}
public void setStaffscoreList(List<Staffscore> staffscoreList) {
this.staffscoreList = staffscoreList;
}
@XmlTransient
public List<Referenceinfo> getReferenceinfoList() {
return referenceinfoList;
}
public void setReferenceinfoList(List<Referenceinfo> referenceinfoList) {
this.referenceinfoList = referenceinfoList;
}
public Personalinfo getPersonalinfo() {
return personalinfo;
}
public void setPersonalinfo(Personalinfo personalinfo) {
this.personalinfo = personalinfo;
}
public Otherinfo getOtherinfo() {
return otherinfo;
}
public void setOtherinfo(Otherinfo otherinfo) {
this.otherinfo = otherinfo;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getUserType() {
return userType;
}
public void setUserType(String userType) {
this.userType = userType;
}
@XmlTransient
public List<Trainingprog> getTrainingprogList() {
return trainingprogList;
}
public void setTrainingprogList(List<Trainingprog> trainingprogList) {
this.trainingprogList = trainingprogList;
}
@XmlTransient
public List<Children> getChildrenList() {
return childrenList;
}
public void setChildrenList(List<Children> childrenList) {
this.childrenList = childrenList;
}
@XmlTransient
public List<Specialskills> getSpecialskillsList() {
return specialskillsList;
}
public void setSpecialskillsList(List<Specialskills> specialskillsList) {
this.specialskillsList = specialskillsList;
}
@XmlTransient
public List<Educback> getEducbackList() {
return educbackList;
}
public void setEducbackList(List<Educback> educbackList) {
this.educbackList = educbackList;
}
@XmlTransient
public List<Voluntarywork> getVoluntaryworkList() {
return voluntaryworkList;
}
public void setVoluntaryworkList(List<Voluntarywork> voluntaryworkList) {
this.voluntaryworkList = voluntaryworkList;
}
@Override
public int hashCode() {
int hash = 0;
hash += (idClients != null ? idClients.hashCode() : 0);
return hash;
}
@Override
public boolean equals(Object object) {
// TODO: Warning - this method won't work in the case the id fields are not set
if (!(object instanceof Clients)) {
return false;
}
Clients other = (Clients) object;
if ((this.idClients == null && other.idClients != null) || (this.idClients != null && !this.idClients.equals(other.idClients))) {
return false;
}
return true;
}
@Override
public String toString() {
return this.lastName + ", " + this.firstName;
}
public String getInstitute() {
return institute;
}
public void setInstitute(String institute) {
this.institute = institute;
}
}
假设您在
PersonalInfo
类中尝试此功能并进行检查
@OneToOne
@JoinColumn(name = "idClients")
private Clients clients;
问题在于插入,但您应该向我们展示进行插入的代码,甚至SQL本身。您尝试插入的行很可能违反了外键约束。它的父类是否存在?请发布personalinfo和client类。映射中似乎有问题。@Tim是的,我先保存客户端,然后尝试插入个人信息。尝试过,但我得到了以下错误:只有一个可以定义为可写,所有其他的都必须指定为只读。是否可以共享异常或stacktrace。异常[EclipseLink-48](Eclipse持久性服务-2.5.2.v20140319-9ad6abd):org.Eclipse.Persistence.exceptions.DescriptorException异常描述:字段[personalinfo.IdClients]存在多个可写映射。只有一个映射可以定义为可写,其他所有映射必须指定为只读。