Java PostgreSQL maunally插入的记录与Spring JPA保存顺序
下面是我的实体和表结构Java PostgreSQL maunally插入的记录与Spring JPA保存顺序,java,spring,postgresql,spring-data-jpa,postgresql-9.6,Java,Spring,Postgresql,Spring Data Jpa,Postgresql 9.6,下面是我的实体和表结构 @Id @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "seq") @SequenceGenerator(name = "seq", sequenceName = "user_data_seq") private Integer id; @Column(name = "FName") private String fname; @Column(name = "LName") Private
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "seq")
@SequenceGenerator(name = "seq", sequenceName = "user_data_seq")
private Integer id;
@Column(name = "FName")
private String fname;
@Column(name = "LName")
Private String lname;
CREATE TABLE user
(
id integer NOT NULL DEFAULT nextval('user_data_seq'::regclass),
fname character varying(32) COLLATE pg_catalog."default" NOT NULL,,
lname character varying(32) COLLATE pg_catalog."default" NOT NULL
CONSTRAINT pk_user PRIMARY KEY (id),
CONSTRAINT user_fname_unique UNIQUE (fname)
}
我已经通过pgAdmin在USER中手动输入了一个条目,其中插入了最新的序列值
INSERT INTO user(fname, lname) VALUES('AAA', 'BBB');
现在应用程序正在使用并尝试更新现有记录的LName。但看起来JPA将此视为新条目并尝试重新插入,因为发生了唯一的约束冲突错误
public User updateLName(final User user) {
User userToUpdate = userRepository.findById(user.getId());
userToUpdate.setLName("CCC");
userToUpdate = userRepository.save(userToUpdate);
return userToUpdate;
}
来自JPA的以下代码(如果条件)仍返回为true,并使要插入的记录成为新记录:
org.springframework.data.jpa.repository.support.SimpleJpaRepository
@Transactional
public <S extends T> S save(S entity) {
if (this.entityInformation.isNew(entity)) {
this.em.persist(entity);
return entity;
} else {
return this.em.merge(entity);
}
}
org.springframework.data.jpa.repository.support.SimpleParepository
@交易的
公共存储(S实体){
if(this.entityInformation.isNew(entity)){
这个.em.persist(实体);
返回实体;
}否则{
返回此.em.merge(实体);
}
}
但是,对于通过应用程序插入的记录来说,这不会是一个问题,因为这些记录已经可以更新了。实体的标识是由它们的主键定义的。因此,您必须指定要更新的数据。要使用
save()
方法更新现有数据,您可以按id获取现有数据
User userToUpdate = userRepository.getOne(id);
委员会将更新其数据
userToUpdate.setFname(userDto.getFName());
最后,调用save方法更新数据库中的数据
userRepository.save(userToUpdate);
如何按代码更新记录?在代码中,用户对象是基于FName找到的。在本例中,完整对象由FName='AAA'找到并从数据库中检索。然后在调用repository.save(user)之前,将再次按id检索数据并修改LName。是的,以类似的方式,数据已按id 1st检索并分配给userToUpdate对象,修改后发送到userRepository.save(userToUpdate)。这是一个相同的错误。@Mahi你能给我们看一下你试过的有问题的代码吗。需要了解您是否保存分离的对象。这里有我的小代码:public User updateLName(最终用户){User userToUpdate=userRepository.findById(User.getId());userToUpdate.setLName(“CCC”);userToUpdate=userRepository.save(userToUpdate);return userToUpdate;}@Mahi请附上问题,在评论中,这是不可理解的,现在附上