[英]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.