gpt4 book ai didi

java - postgres id 生成和 hibernate 的问题

转载 作者:行者123 更新时间:2023-11-29 12:14:05 25 4
gpt4 key购买 nike

出于某种原因,当我从应用程序 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 方法实现:

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) 插入它,它会正常工作,这会按预期工作:

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

所以 hibernate 由于某种原因没有正确生成我的 id,事实是如果上面的语句有效它根本不应该生成它。

我该怎么办?

最佳答案

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

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

关于java - postgres id 生成和 hibernate 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13401683/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com