所以我使用Postgres和Hibernate 4.2.2以及像这样的实体
@Entity(name = "Users")
@Check(constraints = "email ~* '^[A-Za-z0-9._%-]+@[A-Za-z0-9.-]+[.][A-Za-z]+$'")
@DynamicInsert
public class Users {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id_user",unique = true)
@Index(name = "user_pk")
private Integer idUser;
Hibernate仍会插入一些已经在表中的id,而不是让它为数据库填充它的emtpy。而且hibernate根据其缓存强制id甚至不检查数据库是否具有lates id。
我如何强制它以便我可以将id留空并让数据库插入它?
首先我认为这是因为我使用int
并且int
默认为0,但即使使用对象,它也只是强制其缓存中的id。
所以我的目标是让数据库填充id而不是hibernate或者至少是Hibernate,然后填写它以首先检查数据库的id。
答案 0 :(得分:0)
所以我得到的错误是Caused by: org.postgresql.util.PSQLException: ERROR: duplicate key value violates unique constraint "users_pkey" Detail: Key (id_user)=(1) already exists.
并且它不是由Hibernate和缓存引起的,而是在创建数据库时导入数据,我在其中插入了给定的ID,例如:
INSERT INTO users(id_user,email,password,tag) VALUES (1,'a@b.c','***','Adpleydu');
并且生成的顺序没有更新,所以如果我通过控制台插入纯SQL,我会得到同样的错误。
答案 1 :(得分:0)
问题在于播种数据。但是,您仍然可以使用纯等距的种子进行播种,并具有“保持”序列。
1)确保主键的类型为SERIAL。
CREATE TABLE table_name(
id SERIAL
);
2)添加此“ setval”行以确保序列已更新。
select setval('table_name_id_seq',COALESCE((select max(id) + 1 from table_name), 1));