Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java PostgreSQL maunally插入的记录与Spring JPA保存顺序_Java_Spring_Postgresql_Spring Data Jpa_Postgresql 9.6 - Fatal编程技术网

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请附上问题,在评论中,这是不可理解的,现在附上