在我的应用程序中,我将字符串数据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()

原因我很清楚。但是,有人能告诉我,是否有可能像我希望的那样在数据库端生成ids?

最佳答案

使用GenerationType.IDENTITY作为您的id,这将告诉hibernate identity列的id将在DB端生成:

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Short id;

10-01 05:12
查看更多