简体   繁体   中英

Updating primary key for spring boot entity manager jpa

i need to update tow columns inside my table (Job this table is joint with two other tables employees and job-history)one of them is the primary key, but i get error, if someone can help.

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

}

my controller: here when i try to look for all job in the data base it works fine, also if i try to update juste the title of the job it works fine to but in case that i try to set a new primary key for the job table it gives me error here my controller.

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!";



    }

}

i got this error,

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

Thank you for your help.

Primary key should never be changed. If you need to change primary key it means your design is bad. If you need to change JOB_ID often then create another column for your primary key like ID. Another possibility is to copy all attributes and create new record with new JOB_ID and then remove old one.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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