出于某种原因,当我从应用程序id插入数据库时,总是0。这是用于spring security auth table用户的表,从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方法实现:
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应该是Integer
,而不是int
。每次创建类的实例时,它都会将this.id
的值初始化为0。然后Hibernate会认为这个对象已经被持久化了,但是断开了连接。您希望它被视为暂时的,这是由一个空ID表示的。请参阅Hibernate objects states in the manual的讨论。
当您session.save(user)
时,Hibernate将看到ID为空,意识到对象是暂时的,为它生成一个ID,并保存它。
关于java - Postgres ID生成和 hibernate 问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13401683/