MappedSuperclass – Change SequenceGenerator en la subclase

Estoy usando JPA2 con Hibernate y trato de introducir una clase base común para mis entidades. Hasta ahora parece que:

@MappedSuperclass public abstract class BaseEntity { @Id private Long id; @Override public int hashCode() { // ... } @Override public boolean equals(Object obj) { // ... } public Long getId() { return this.id; } public void setId(Long id) { this.id = id; } } 

Sin embargo, para cada tabla hay una secuencia $entityname_seq que quiero usar como mi generador de secuencia. ¿Cómo puedo configurar eso desde mi subclase? Creo que necesito anular @GeneratedValue y crear un nuevo SequenceGenerator con @SequenceGenerator.

Sí, es posible. Puede anular el nombre predeterminado del generador con la anotación @SequenceGenerator .

  • Clase base
  @MappedSuperclass public abstract class PersistentEntity implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "default_gen") protected Long id = 0L; public Long getId() { return id; } public void setId(Long id) { this.id = id; } } 
  • Secuencia (SQL)

     create sequence role_seq; 
  • Clase derivada

  @Entity @Table(name = "role") @SequenceGenerator(name = "default_gen", sequenceName = "role_seq", allocationSize = 1) public class Role extends PersistentEntity implements Serializable { private static final long serialVersionUID = 1L; @NotNull @Size(max = 32) private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } } 
  • Este enfoque funcionó bien en Hibernate 4.1.x, pero no en EclipseLink 2.x.

editar

  • Según el comentario, parece estar funcionando con EclipseLink 2.6.1-RC1.

En JPA eso no se puede hacer con anotaciones. La anotación en sí no puede ser anulada. Entity hereda toda la información de mapeo de MappedSuperClass . Solo hay dos anotaciones que se pueden usar para redefinir las asignaciones heredadas de la superclase mapeada:

  1. AttributeOverride para anular las asignaciones de columna y
  2. AssociationOverride para reemplazar las columnas / tablas de unión.

Ninguno de los dos ayuda con GeneratedValue.

Con EclipseLink, puede usar un Customizer . DescriptorCustomizer interfaz DescriptorCustomizer define una forma de personalizar toda la información sobre un descriptor jpa (también conocido como entidad persistente).

 public class SequenceCustomizer implements DescriptorCustomizer { @Override public void customize(ClassDescriptor descriptor) throws Exception { descriptor.setSequenceNumberName(descriptor.getTableName()); } } 

y en su superclase mapeada:

 @MappedSuperclass @Customizer(SequenceCustomizer.class) public abstract class AbstractEntity implements Serializable { ... }