在子类上的休眠中为每个表指定不同的序列

2022-09-01 12:45:51

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

我们应用程序中的所有实体都扩展了一个名为这样的超类: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

我想做的是为每个实体使用一个单独的序列,例如和上面的示例。如果在子类上指定了 ID,那么我可以使用注释为每个实体指定一个序列,但在本例中,ID 位于超类上。鉴于 ID 位于超类中,有没有办法为每个实体使用单独的序列 — 如果是这样,如何?entity_a_sequenceentity_b_sequence@SequenceGenerator

(我们使用的是PostgreSQL 8.3,以防万一相关)


答案 1

你试过这样做吗?

@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 {

}

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


答案 2

我们在所有 JPA 实体的抽象超类中使用它:

@Id
@GeneratedValue(generator = "pooled")
@GenericGenerator(name = "pooled", strategy = "org.hibernate.id.enhanced.TableGenerator", parameters = {
        @org.hibernate.annotations.Parameter(name = "value_column_name", value = "sequence_next_hi_value"),
        @org.hibernate.annotations.Parameter(name = "prefer_entity_table_as_segment_value", value = "true"),
        @org.hibernate.annotations.Parameter(name = "optimizer", value = "pooled-lo"),
        @org.hibernate.annotations.Parameter(name = "increment_size", value = "100")})
private Long id;

它有点冗长,但它允许设置,这意味着您不需要在子类中重复字段或生成器注释。prefer_entity_table_as_segment_valueid


推荐