在我的应用程序中,我使用字符串数据JPA和PostgreSQL。对于我的应用程序中的所有实体,我正在寻找方法,纯粹在数据库端生成id。
所以,例如,这里是我目前正在使用的版本:
@Entity
@Table(name = "permissions")
public class PermissionEntity {
@Id
@SequenceGenerator(name="permSeq", sequenceName="perm_id_seq", allocationSize = 1)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator="permSeq")
private Short id;
...........
}
我正在使用allocationSize = 1
来避免冲突,因为我将拥有应用程序的多个实例,这些实例将与同一个数据库一起使用。
但是在这种情况下,每次创建permission
之前,应用程序都会向数据库perm_id_seq
序列发出请求以接收下一个值。我想纯粹在数据库方面创建id
,就像jdbc template
一样。为此,我为id
= nextval('perm_id_seq'::regclass)
设置了默认值并修改了我的代码:
@Entity
@Table(name = "permissions")
public class PermissionEntity {
@Id
private Short id;
...........
}
现在,当我尝试保存实体时,它会引发异常:
org.hibernate.id.IdentifierGenerationException: ids for this class must be manually assigned before calling save()
原因对我来说很清楚。但是,有人可以告诉我,是否可以按照我的意愿在数据库端生成id
?
答案 0 :(得分:5)
使用GenerationType.IDENTITY
作为你的id,这将告诉hibernate将在数据库端生成标识列的id:
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Short id;