Java CascadeType.ALL不更新子元素
我正试图通过RESTAPI向数据库中添加一个新的员工实体。雇员实体包含一个城市属性。这是一种多人关系。当我在一个新的(不存在的)城市中插入一名新员工时,工作正常。但是,当我在现有城市中添加新员工时,会出现此错误Java CascadeType.ALL不更新子元素,java,spring,hibernate,jpa,jdbc,Java,Spring,Hibernate,Jpa,Jdbc,我正试图通过RESTAPI向数据库中添加一个新的员工实体。雇员实体包含一个城市属性。这是一种多人关系。当我在一个新的(不存在的)城市中插入一名新员工时,工作正常。但是,当我在现有城市中添加新员工时,会出现此错误 com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry '1000' for key 'PRIMARY' 我的CascadeType设置为ALL。当我将其更改
com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry '1000' for key 'PRIMARY'
我的CascadeType设置为ALL。当我将其更改为SAVE_UPDATE时,当我在现有城市中插入新员工时,它可以正常工作,但当我在新城市中插入新员工时,它不起作用
雇员:
package be.pxl.backend.entity;
import java.util.Date;
import java.util.List;
import javax.persistence.*;
import javax.persistence.Entity;
import javax.persistence.Table;
import org.hibernate.annotations.*;
import org.hibernate.annotations.CascadeType;
@Entity
@Table(name="Employees")
public class Employee {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private int employee_id;
private String username;
private String password;
private String salt;
private String surName;
private String name;
private String street;
@Column(name="house_nr")
private String houseNr;
@ManyToOne
@Cascade (value={CascadeType.MERGE, CascadeType.PERSIST})
private City city;
private Date date_employment;
private String mobile_phone;
private String telephone_number;
private String email;
private String sex;
private Boolean status;
@OneToMany(mappedBy="employee")
private List<Login> logins;
@OneToMany(mappedBy = "employee")
private List<SensorUsage> usages ;
public List<Login> getLogins() {
return logins;
}
public Boolean getStatus() {
return status;
}
public int getEmployee_id() {
return employee_id;
}
public String getUsername() {
return username;
}
public String getPassword() {
return password;
}
public String getSalt() {
return salt;
}
public String getSurName() {
return surName;
}
public String getName() {
return name;
}
public String getStreet() {
return street;
}
public String getHouseNr() {
return houseNr;
}
public City getCity() {
return city;
}
public Date getDate_employment() {
return date_employment;
}
public String getMobile_phone() {
return mobile_phone;
}
public String getTelephone_number() {
return telephone_number;
}
public String getEmail() {
return email;
}
public String getSex() {
return sex;
}
public void setStatus(boolean status) { this.status = status; }
}
包be.pxl.backend.entity;
导入java.util.Date;
导入java.util.List;
导入javax.persistence.*;
导入javax.persistence.Entity;
导入javax.persistence.Table;
导入org.hibernate.annotations.*;
导入org.hibernate.annotations.CascadeType;
@实体
@表(name=“Employees”)
公营雇员{
@身份证
@GeneratedValue(策略=GenerationType.AUTO)
私人内部雇员身份证;
私有字符串用户名;
私有字符串密码;
私盐;
私家姓;
私有字符串名称;
私家弦街;;
@列(name=“house\u nr”)
私人住宅;
@许多酮
@级联(值={CascadeType.MERGE,CascadeType.PERSIST})
私人城市;
私人雇佣日期;
专用串手机;
专用字符串电话号码;
私人字符串电子邮件;
私密性;
私有布尔状态;
@OneToMany(mappedBy=“employee”)
私人名单登录;
@OneToMany(mappedBy=“employee”)
私人清单用途;
公共列表getLogins(){
返回登录;
}
公共布尔getStatus(){
返回状态;
}
public int getEmployee_id(){
返回员工id;
}
公共字符串getUsername(){
返回用户名;
}
公共字符串getPassword(){
返回密码;
}
公共字符串getSalt(){
返盐;
}
公共字符串getNames(){
返回姓氏;
}
公共字符串getName(){
返回名称;
}
公共字符串getStreet(){
返回街;;
}
公共字符串getHouseNr(){
返回房屋编号;
}
公共城市{
回归城市;
}
公开日期getDate_就业(){
就业返回日期;
}
公共字符串getMobile_phone(){
归还手机;
}
公共字符串getTelephone_number(){
返回电话号码;
}
公共字符串getEmail(){
回复邮件;
}
公共字符串getSex(){
回归性;
}
public void setStatus(布尔状态){this.status=status;}
}
城市:
包be.pxl.backend.entity;
导入javax.persistence.*;
导入java.util.List;
@实体
@表(name=“Cities”)
公营城市{
@身份证
专用字符串邮政编码;
私人城市;
@OneToMany(mappedBy=“城市”)
私人名单目的地;
@OneToMany(mappedBy=“城市”)
私人名单雇员;
公共字符串getPostal_代码(){
返回邮政编码;
}
公共字符串getCity(){
回归城市;
}
}
这就是我坚持的地方:
package be.pxl.backend.repository;
import java.util.List;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;
import be.pxl.backend.entity.*;
@Repository
public interface EmployeeRepository extends JpaRepository<Employee, Integer> {
@Query("from Employee e where e.username = :username")
Employee getEmployeeByUsername(@Param("username")String username);
}
package be.pxl.backend.repository;
导入java.util.List;
导入org.springframework.data.jpa.repository.JpaRepository;
导入org.springframework.data.jpa.repository.Query;
导入org.springframework.data.repository.query.Param;
导入org.springframework.stereotype.Repository;
导入be.pxl.backend.entity.*;
@存储库
公共接口EmployeeRepository扩展了JpaRepository{
@查询(“来自员工e,其中e.username=:username”)
员工getEmployeeByUsername(@Param(“用户名”)字符串用户名);
}
谢谢你的帮助 要设置双向多对一关联,您需要执行以下操作: 当然,在源/拥有实体(带有外键的实体)上,您可以使用
@ManyToOne
注释对其进行注释,也可以使用@JoinColumn
注释对其进行注释。在您的情况下,员工实体上应该是这样的:
@Entity
@Table(name="Employees")
public class Employee {
@ManyToOne
@JoinColumn(name = "your_fk_column")
private City city;
}
在您的城市实体上执行以下操作:
@Entity
@Table(name="Cities")
public class City {
@OneToMany(cascade = CascadeType.ALL, mappedBy = "city")
private List<Employee> employees;
}
如果您希望在保存实体之前使用不同的主键保存所有相同的城市记录,请将城市主键设置为null
或者,就像我做的那样,将瀑布移动到城市实体。
就像这样,每当你试图拯救一名雇员时,这个城市也不会得到持续的支持
或者只需将级联类型从all更改为除persist之外的所有级联类型 在持久化的地方显示代码please@davidxxx完成!你如何拯救员工?通过JpaRepository。这对我来说是可行的,我不必自己使用实体管理器和事务处理等。在
员工中,您忘记将@JoinColumn(name=“your_foreign_key”)
添加到城市中。请您重新表述级联类型的含义。所有?虽然与此问题没有直接关系,未来的读者也可能会研究“孤儿搬迁”问题@OneToMany(mappedBy=“childObjectPrivateMemberName”,targetEntity=MyChildClass.class,cascade=CascadeType.ALL,fetch=FetchType.EAGER,orphanRemoving=true)
@Entity
@Table(name="Cities")
public class City {
@OneToMany(cascade = CascadeType.ALL, mappedBy = "city")
private List<Employee> employees;
}
Duplicate entry '1000' for key 'PRIMARY'