更新主键spring boot jpa

时间:2017-10-20 22:05:28

标签: java hibernate jpa spring-boot

我需要更新我的表格中的拖曳列(作业此表与其他两个表员工和工作历史联合)其中一个是主键,但如果有人可以提供帮助,我会收到错误!

package com.touati.org.model;
import java.io.Serializable;
import javax.persistence.*;
import java.math.BigDecimal;
import java.util.List;


/**
 * The persistent class for the jobs database table.
 * 
 */
@Entity
@Table(name="jobs")
@NamedQuery(name="Job.findAll", query="SELECT j FROM Job j")
public class Job implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @Column(name="JOB_ID")
    private String jobId;

    @Column(name="JOB_TITLE")
    private String jobTitle;

    @Column(name="MAX_SALARY")
    private BigDecimal maxSalary;

    @Column(name="MIN_SALARY")
    private BigDecimal minSalary;

    //bi-directional many-to-one association to Employee
    @OneToMany(mappedBy="job")
    private List<Employee> employees;

    //bi-directional many-to-one association to JobHistory
    @OneToMany(mappedBy="job")
    private List<JobHistory> jobHistories;

    public Job() {
    }

    public String getJobId() {
        return this.jobId;
    }

    public void setJobId(String jobId) {
        this.jobId = jobId;
    }

    public String getJobTitle() {
        return this.jobTitle;
    }

    public void setJobTitle(String jobTitle) {
        this.jobTitle = jobTitle;
    }

    public BigDecimal getMaxSalary() {
        return this.maxSalary;
    }

    public void setMaxSalary(BigDecimal maxSalary) {
        this.maxSalary = maxSalary;
    }

    public BigDecimal getMinSalary() {
        return this.minSalary;
    }

    public void setMinSalary(BigDecimal minSalary) {
        this.minSalary = minSalary;
    }

    public List<Employee> getEmployees() {
        return this.employees;
    }

    public void setEmployees(List<Employee> employees) {
        this.employees = employees;
    }

    public Employee addEmployee(Employee employee) {
        getEmployees().add(employee);
        employee.setJob(this);

        return employee;
    }

    public Employee removeEmployee(Employee employee) {
        getEmployees().remove(employee);
        employee.setJob(null);

        return employee;
    }

    public List<JobHistory> getJobHistories() {
        return this.jobHistories;
    }

    public void setJobHistories(List<JobHistory> jobHistories) {
        this.jobHistories = jobHistories;
    }

    public JobHistory addJobHistory(JobHistory jobHistory) {
        getJobHistories().add(jobHistory);
        jobHistory.setJob(this);

        return jobHistory;
    }

    public JobHistory removeJobHistory(JobHistory jobHistory) {
        getJobHistories().remove(jobHistory);
        jobHistory.setJob(null);

        return jobHistory;
    }

}

我的控制器:这里当我试图在数据库中查找所有工作时它工作正常,如果我尝试更新juste工作的标题它工作正常但是如果我尝试设置一个新的主要作业表的键,它给我错误在这里我的控制器。

package com.touati.org.model;

import java.io.IOException;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.ResponseStatus;







@Controller    // This means that this class is a Controller
@RequestMapping(path="/project") // This means URL's start with /demo (after Application path)
public class MainController {



    @GetMapping(path="/job")
    public @ResponseBody Iterable<Job> getAllJob() {
        // This returns a JSON or XML with the users
        return jobRepository.findAll();
    }




    @GetMapping(path="/job/{jobId}")
    public @ResponseBody String getJob(@PathVariable String jobId) {
        Job job = jobRepository.findOne(jobId);

        try {
        job.setJobTitle("manager");
        job.setJobId("test1");
       jobRepository.save(job);
        }
        catch (Exception ex) {
            return "Error updating the job: " + ex.toString();
        }
        return "Job succesfully updated!";



    }

我收到了这个错误,

Error updating the user: org.springframework.orm.jpa.JpaSystemException: identifier of an instance of com.touati.org.model.Job was altered from test to test1; nested exception is org.hibernate.HibernateException: identifier of an instance of com.touati.org.model.Job was altered from test to test1

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

不允许更改实体的PK - 如果你真的必须这样做,你应该删除并重新创建它。

参考(较旧的问题):JPA Hibernate - changing the primary key of an persisted object