如果ID是在映射的超类上定义的,有没有办法为Hibernate中的每个表指定不同的序列?

应用程序中的所有实体都扩展了一个名为DataObject的超类,如下所示:

@MappedSuperclass
public abstract class DataObject implements Serializable {
    @Id 
    @GeneratedValue(strategy = GenerationType.SEQUENCE)
    @Column(name = "id")
    private int id;
}

@Entity
@Table(name = "entity_a")
public class EntityA extends DataObject { ... }

@Entity
@Table(name = "entity_b")
public class EntityB extends DataObject { ... }

这会导致所有实体使用一个共享序列,默认为hibernate_sequence.

我想 for each 实体使用一个单独的序列,例如上面例子中的entity_a_sequenceentity_b_sequence.如果ID是在子类上指定的,那么我可以使用@SequenceGenerator注释 for each 实体指定一个序列,但在本例中,ID在超类上.鉴于ID在超类中,有没有一种方法可以 for each 实体使用单独的序列?如果有,如何使用?

(We are using PostgreSQL 8.3, in case that's relevant)

推荐答案

你试过这样做吗?

@MappedSuperclass
public abstract class DataObject implements Serializable {
    @Id 
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "idgen")
    @Column(name = "id")
    private int id;
}

@Entity
@SequenceGenerator(initialValue = 1, name = "idgen", sequenceName = "entityaseq")
@Table(name = "entity_a")
public class EntityA extends DataObject { 

}

@Entity
@SequenceGenerator(initialValue = 1, name = "idgen", sequenceName = "entitybseq")
@Table(name = "entity_b")
public class EntityB extends DataObject {

}

很抱歉,我现在没有测试它所需的环境,但我会稍后再试.

Postgresql相关问答推荐

优化PostgreSQL查询以将用户插入数据库

我无法在过程中提交

如何诊断字符编码问题

在 postgres/presto/AWS-Athena 中,与 array_agg( (col1, col2) ) 相反的是什么来获得每组多行?

并行取消嵌套多个数组

转换数组类型

PostgreSQL - 改变数字的精度?

PostgreSQL 在 mySQL 中的 date_trunc

在 postgres 中删除所有共享相同前缀的表

需要将整个 postgreSQL 数据库加载到 RAM 中

PostgreSQL:如何安装 plpythonu 扩展

如何为查询执行设置语句超时

在 Windows 10 中执行时,Docker 容器关闭并给出data directory has wrong ownership错误

如何在 PostgreSQL 中插入多行

理解 Postgres 行大小

将数据从 MS SQL 迁移到 PostgreSQL?

将数据推送到 Heroku 时出错:time zone displacement out of range

PostgreSQL 字符串(255) 限制 - Rails、Ruby 和 Heroku

避免通过 JPA 将null值插入数据库表

如何为 Postgresql 中的所有数据库创建具有只读权限的用户?