强制休眠,将id留空

时间:2016-05-28 17:38:40

标签: java hibernate postgresql jpa

所以我使用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。

2 个答案:

答案 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));

参考:

https://www.postgresqltutorial.com/postgresql-serial/