Postgres Hibernate 主键生成问题
Postgres Hibernate Primary Key generation Issue
我正在尝试使用 Hibernate ORM 在 Employee table 中插入一条记录,但不断收到错误消息:
org.hibernate.AssertionFailure: null id in
com.example.helloworld.entities.Employee entry (don't flush the Session
after an exception occurs)
如果我传递 ID 值那么它工作正常但是虽然我使用了 @GeneratedValue(strategy = GenerationType.IDENTITY)
它不会自动生成 'id'
。任何帮助表示赞赏! DB 模式和实体代码的详细信息如下所示。
数据库引擎:Postgres
ORM:休眠
我有以下两个 tables :
Table姓名员工:
Column Name | Type | Length | Not Null | Default
name | Varchar | 64 | true | NULL
id | int8 | 19 | true |nextval(Employee_id::regclass)
company_id | int8 |19 | true | NULL
Table #公司
Column Name | Type | Length | Not Null | Default
Cname | Varchar | 64 | true | NULL
id | int8 | 19 | true | nextval(Company_id::regclass)
面积 |变量 |64 |真 |空
实体 Java 类 以上 tables :
@Entity
@Table(name = "Employee")
public class Employee {
public Employee() {super();}
@Id
@Column(name = "id", columnDefinition = "serial")
@GeneratedValue(strategy = GenerationType.IDENTITY)
@NotNull
private long id;
@NotNull
@Column(name = "company_id")
private long company_id;
@NotNull
@Column(name = "name")
private String name;
@ManyToOne
private Company company;
/**
setters and getters
**/
}
@Entity
@Table(name = "Company")
public class Company {
public Company() {super();}
@Id
@Column(name = "id", columnDefinition = "serial")
@GeneratedValue(strategy = GenerationType.IDENTITY)
@NotNull
private long id;
@NotNull
@Column(name = "area")
private String area;
@NotNull
@Column(name = "cname")
private String cname;
@OneToMany(cascade=CascadeType.ALL)
@JoinColumn(name="company_id")
private Set<Employee> employees;
/**
setters and getters
**/
}
我对 Postgres 也有同样的问题。
尝试将 SequenceGenerator
添加到您的 id
字段:
@Id
@Column(name = "id", columnDefinition = "serial")
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator="SEQ_EMPLOYEE")
@SequenceGenerator(name="SEQ_EMPLOYEE", sequenceName="SEQ_EMPLOYEE", allocationSize=1)
@NotNull
private long id;
将SEQ_EMPLOYEE
替换为数据库中的序列名称。
这对我有用:
@Id
@Column(name = "id", columnDefinition = "serial")
@GeneratedValue(strategy = GenerationType.IDENTITY, generator="seq_name_generated_in_db")
@SequenceGenerator(name="seq_name_generated_in_db", sequenceName="seq_name_generated_in_db", initialValue = 1 , allocationSize=1)
我正在尝试使用 Hibernate ORM 在 Employee table 中插入一条记录,但不断收到错误消息:
org.hibernate.AssertionFailure: null id in
com.example.helloworld.entities.Employee entry (don't flush the Session
after an exception occurs)
如果我传递 ID 值那么它工作正常但是虽然我使用了 @GeneratedValue(strategy = GenerationType.IDENTITY)
它不会自动生成 'id'
。任何帮助表示赞赏! DB 模式和实体代码的详细信息如下所示。
数据库引擎:Postgres
ORM:休眠
我有以下两个 tables :
Table姓名员工:
Column Name | Type | Length | Not Null | Default
name | Varchar | 64 | true | NULL
id | int8 | 19 | true |nextval(Employee_id::regclass)
company_id | int8 |19 | true | NULL
Table #公司
Column Name | Type | Length | Not Null | Default
Cname | Varchar | 64 | true | NULL
id | int8 | 19 | true | nextval(Company_id::regclass)
面积 |变量 |64 |真 |空
实体 Java 类 以上 tables :
@Entity
@Table(name = "Employee")
public class Employee {
public Employee() {super();}
@Id
@Column(name = "id", columnDefinition = "serial")
@GeneratedValue(strategy = GenerationType.IDENTITY)
@NotNull
private long id;
@NotNull
@Column(name = "company_id")
private long company_id;
@NotNull
@Column(name = "name")
private String name;
@ManyToOne
private Company company;
/**
setters and getters
**/
}
@Entity
@Table(name = "Company")
public class Company {
public Company() {super();}
@Id
@Column(name = "id", columnDefinition = "serial")
@GeneratedValue(strategy = GenerationType.IDENTITY)
@NotNull
private long id;
@NotNull
@Column(name = "area")
private String area;
@NotNull
@Column(name = "cname")
private String cname;
@OneToMany(cascade=CascadeType.ALL)
@JoinColumn(name="company_id")
private Set<Employee> employees;
/**
setters and getters
**/
}
我对 Postgres 也有同样的问题。
尝试将 SequenceGenerator
添加到您的 id
字段:
@Id
@Column(name = "id", columnDefinition = "serial")
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator="SEQ_EMPLOYEE")
@SequenceGenerator(name="SEQ_EMPLOYEE", sequenceName="SEQ_EMPLOYEE", allocationSize=1)
@NotNull
private long id;
将SEQ_EMPLOYEE
替换为数据库中的序列名称。
这对我有用:
@Id
@Column(name = "id", columnDefinition = "serial")
@GeneratedValue(strategy = GenerationType.IDENTITY, generator="seq_name_generated_in_db")
@SequenceGenerator(name="seq_name_generated_in_db", sequenceName="seq_name_generated_in_db", initialValue = 1 , allocationSize=1)