Указание отдельной последовательности в таблице в 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;
Он работает в моем приложении.