Указание отдельной последовательности в таблице в Hibernate для подклассов

Есть ли способ указать различные последовательности для каждой таблицы в 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.

Что я хотел бы сделать, так это использовать отдельную последовательность для каждого объекта, например entity_a_sequence и entity_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_value, что означает, что вам не нужно повторять поле id или аннотации генератора в подклассах.

Ответ 3

TABLE генерация stretergy использует отдельную последовательность db для каждой таблицы, но это очень дорогостоящая операция

Ответ 4

IHMO есть лучший способ сделать это:

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

Он работает в моем приложении.