簡體   English   中英

postgres id 生成和休眠的問題

[英]Issues with postgres id generation and hibernate

出於某種原因,當我從應用程序 id 插入數據庫時​​總是 0。這是用於 spring 安全認證表用戶的表,從 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);

道法實現:

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 槽 sql 客戶端(pgadmin)插入它,它會正常工作,這會按預期工作:

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

因此,出於某種原因,休眠無法正確生成我的 id,事實是,如果上述語句有效,則根本不應該生成它。

我該怎么辦?

您的 ID 應該是一個Integer ,而不是一個int 每次創建類的實例時,它都會將this.id的值初始化為 0。然后 Hibernate 會認為該對象已經被持久化,但已斷開連接。 您希望將其視為瞬態,這通過具有空 ID 來表示。 請參閱手冊中有關Hibernate 對象狀態的討論。

當你session.save(user) ,Hibernate 會看到 ID 為空,意識到對象是瞬態的,為它生成一個 ID,並保存它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM