Java 使用合并函数时出现Spring JPA插入操作异常

Java 使用合并函数时出现Spring JPA插入操作异常,java,spring,jpa,Java,Spring,Jpa,人类 package com.example.springjpa.demojpa.entity; import java.sql.Timestamp; import java.util.Date; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; @Entity public class Person { @Id @Generated

人类

package com.example.springjpa.demojpa.entity;

import java.sql.Timestamp;
import java.util.Date;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

@Entity
public class Person {

@Id
@GeneratedValue
private int id;

private String name;
private String location;
private Date birth_date;

public Person() {};



public Person(String name, String location, Date birth_date) {
    super();
    this.name = name;
    this.location = location;
    this.birth_date = birth_date;
}



public Person(int id, String name, String location, Date birth_date) {
    super();
    this.id = id;
    this.name = name;
    this.location = location;
    this.birth_date = birth_date;
}



public int getId() {
    return id;
}

public void setId(int id) {
    this.id = id;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public String getLocation() {
    return location;
}

public void setLocation(String location) {
    this.location = location;
}

public Date getBirth_date() {
    return birth_date;
}

public void setBirth_date(Timestamp birth_date) {
    this.birth_date = birth_date;
}

@Override
public String toString() {
    return "\n Person [name=" + name + ", location=" + location + ", birth_date=" + birth_date + "]";
}

}
PersonJpaDao类

package com.example.springjpa.demojpa;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.transaction.Transactional;

import org.springframework.stereotype.Repository;

import com.example.springjpa.demojpa.entity.Person;

@Repository
@Transactional
public class PersonJpaDao {

@PersistenceContext
EntityManager em;

public Person findById(int id) {
    return em.find(Person.class, id);
}


public Person insert(Person person){
    return em.merge(person);
}

public Person update(Person person){
    return em.merge(person);
}
}
主类

 package com.example.springjpa.demojpa;


import java.util.Date;

import javax.transaction.Transactional;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

import com.example.springjpa.demojpa.entity.Person;

@SpringBootApplication
public class DemoJpaApplication implements CommandLineRunner {

private Logger logger = LoggerFactory.getLogger(this.getClass());

public static void main(String[] args) {
    SpringApplication.run(DemoJpaApplication.class, args);
}

@Autowired
PersonJpaDao personJpaDao;

@Override
public void run(String... args) throws Exception {

    logger.info("Person yBy Id {}", personJpaDao.findById(1));

    logger.info("Update 10003 -> {}", 
            personJpaDao.update(new Person("Pieter", "Utrecht", new Date())));

}
}
当我运行main函数时,find和update工作正常,但是对于与update具有相同代码的insert操作,会引发如下异常:

原因:org.springframework.dao.DataIntegrityViolationException:无法执行语句;SQL[n/a];约束[“PUBLIC.PERSON(ID)上的主键];SQL语句: 插入个人(出生日期、地点、姓名、身份证)值(?,?,?)[23505-196];嵌套异常为org.hibernate.exception.ConstraintViolationException:无法执行语句


原因:org.hibernate.exception.ConstraintViolationException:无法执行语句

我遇到了相同的问题,但我发现它与主键冲突,就像某些数据已经与某些(主键20)存在,实体管理器也存在冲突
将其设置为相同的主键(20),因为您正在使用merge方法更新和创建这两个主键,因此会导致以前存在的和通过merge方法新创建的主键冲突。请尝试在构造函数中提供id或删除数据

如何执行insert,如果id已经存在,则仅显示findById和update.update更新,否则将插入新值;我发现了错误,因为我使用的注释@GeneratedValue插入与数据库中已经存在的id冲突