Указание отдельной последовательности для таблицы в Hibernate на подклассах - PullRequest
22 голосов
/ 30 декабря 2010

Есть ли способ указать отдельные последовательности для каждой таблицы в 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, чтобы указать последовательность для каждого объекта, но в этом случае идентификатор находится в суперклассе.Учитывая, что ID находится в суперклассе, есть ли способ, которым я могу использовать отдельную последовательность для каждой сущности - и если да, то как?

(Мы используем PostgreSQL 8.3, в случае необходимости)

Ответы [ 4 ]

35 голосов
/ 30 декабря 2010

Вы пытались сделать это таким образом?

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

}

Извините, у меня нет необходимой среды для тестирования прямо сейчас, но я попробую позже.

4 голосов
/ 04 мая 2015

Мы используем это в абстрактном суперклассе всех наших объектов 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 или примечания генератора в подклассах.

1 голос
/ 29 апреля 2014

При генерации таблицы TABLE используется отдельная последовательность дБ для каждой таблицы , но это немного дорогая операция

0 голосов
/ 30 ноября 2014

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...