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冲突