有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

postgres id生成和hibernate的java问题

由于某种原因,当我从应用程序id插入数据库时,id始终为0。此表用于spring security auth表用户,从pgadmin II复制:

 id serial NOT NULL,
  username character varying(100),
  password character varying(200),
  groupfk integer,
  CONSTRAINT users_pk PRIMARY KEY (id ),
  CONSTRAINT users_groupfk_fkey FOREIGN KEY (groupfk)
  REFERENCES groups (id) MATCH SIMPLE
  ON UPDATE NO ACTION ON DELETE NO ACTION

我的用户域类中有以下相关ID部分:

    @Id
    @Column(name = "id", columnDefinition = "serial")
    @Generated(GenerationTime.INSERT)
    public int getId() {
        return id;
    }

    @ManyToOne
@JoinColumn(name = "groupfk")
public Group getGroup() {
    return group;
}

public void setGroup(Group group) {
    this.group = group;
}

所以我像这样插入用户:

User user = new User();
        user.setPassword(password);
        user.setUsername(username);

        Group group = new Group();
        group.setId(usergroup);
        user.setGroup(group);
                dao.saveUser(user);

Dao方法impl:

public void save(User user) {
        Session session = sessionFactory.getCurrentSession();
        session.save(user);
    }

这是我得到的一个例外:

Could not execute JDBC batch update; SQL [insert into users (groupfk, password, username, id) values (?, ?, ?, ?)]; constraint [null]; nested exception is org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update

真实查询:

Batch entry 0 insert into users (groupfk, password, username, id) values ('1', '098f6bcd4621d373cade4e832627b4f6', 'test3', '0') was aborted.  Call getNextException to see the cause.

因此,我插入了id为0的前一个用户,结果成功。我尝试插入另一个,但因为它具有相同的ID,所以发生了此错误

通常,如果我尝试通过sql客户端(pgadmin)使用sql插入它,它会正常工作,这与预期的一样:

insert into users (username, password, groupfk) VALUES ('test', 'c20ad4d76fe97759aa27a0c99bff6710',1);

所以hibernate由于某些原因不能正确地生成我的id,事实是,如果上面的语句起作用,它就根本不应该生成id

我该怎么办


共 (1) 个答案

  1. # 1 楼答案

    您的ID应该是Integer,而不是int。每次创建类的实例时,它都会将this.id的值初始化为0。然后,Hibernate会认为这个对象已经被持久化,但已断开连接。您希望它被视为暂时的,这是由一个空ID表示的。请参阅Hibernate objects states in the manual的讨论

    session.save(user)时,Hibernate会看到ID为空,意识到对象是暂时的,为它生成一个ID,然后保存它