2

由于某种原因,当我从应用程序 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);

道方法 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 trough sql client (pgadmin) 插入它,它可以正常工作,这可以按预期工作:

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

因此,由于某种原因,hibernate 无法适当地生成我的 id,事实是,如果上述语句有效,则根本不应该生成它。

我该怎么办?

4

1 回答 1

2

您的 ID 应该是Integer,而不是int。每次创建类的实例时,它都会将 的值初始化this.id为 0。Hibernate 会认为这个对象已经被持久化,但已断开连接。您希望将其视为瞬态的,这由具有空 ID 表示。请参阅手册中有关 Hibernate 对象状态的讨论。

当你 时session.save(user),Hibernate 会看到 ID 为 null,意识到对象是瞬态的,为它生成一个 ID,并保存它。

于 2012-11-15T18:19:25.560 回答