繁体   English   中英

CascadeType.ALL 不更新子元素

[英]CascadeType.ALL does not update child element

我正在尝试通过我的 REST-api 向数据库添加一个新的员工实体。 Employee 实体包含一个 City 属性。 这是一个多对一的关系。 当我插入一个新的(不存在的)城市的新员工时,它工作正常。 但是,当我在现有城市中添加新员工时,出现此错误。

com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry '1000' for key 'PRIMARY'

我的 CascadeType 设置为 ALL。 当我将其更改为 SAVE_UPDATE 时,当我插入一个具有 EXISTING 城市的新员工时它可以正常工作,但是当我插入一个带有新城市的新员工时它不起作用。

员工:

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; }

}

城市:

package be.pxl.backend.entity;

import javax.persistence.*;
import java.util.List;

@Entity
@Table(name="Cities")
public class City {

    @Id
    private String postal_code;
    private String city;
    @OneToMany(mappedBy = "city")
    private List<Destination> destinations;
    @OneToMany(mappedBy = "city")
    private List<Employee> employees;

    public String getPostal_code() {
        return postal_code;
    }
    public String getCity() {
        return city;
    }

}

这是我坚持的地方:

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);
}

帮助将不胜感激!

为了设置双向多对一关联,您需要执行以下操作:

在源/拥有实体(与外键的实体)的你,当然,用注释它@ManyToOne标注,并且还与对其进行批注@JoinColumn注解。 在你的情况下,这就是它在 Employee 实体上的样子:

@Entity
  @Table(name="Employees")
  public class Employee {

  @ManyToOne
  @JoinColumn(name = "your_fk_column")
  private City city;
  }

在您的 City 实体上执行以下操作:

@Entity
@Table(name="Cities")
public class City {

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "city")
    private List<Employee> employees;
}

CascadeType.ALL将参考您的示例执行的操作之一是,当您尝试保留/保存员工时,由于CascadeType.ALL它会对关联的城市执行相同的操作。

现在,如果您尝试使用现有城市保存一名新员工,很明显您会得到您所得到的错误,因为当您尝试保存一名新员工时,Hibernate 会尝试保存现有城市,但是您不能使用相同的 PK 两次保存相同的记录,这就是 Hibernate 抱怨的原因:

Duplicate entry '1000' for key 'PRIMARY'

如果你想用不同的主键记录所有相同的城市,就在保存实体之前,将城市PK设置为空。

或者,像我一样将级联移动到城市实体。 就像这样,每当你试图拯救一名员工时,这座城市也不会持续存在。

或者只是将级联类型从 all 更改为每个级联类型(persist 除外)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM