MappedSuperclass-Change SequenceGenerator dans la sous-classe
J'utilise JPA2 avec Hibernate et j'essaie d'introduire une classe de base commune pour mes entités. Jusqu'à présent, il ressemble à ceci:
@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;
}
}
Cependant, pour chaque table il y a une séquence $entityname_seq Que je veux utiliser comme générateur de séquence. Comment puis-je définir cela à partir de ma sous-classe? Je pense que je dois remplacer @GeneratedValue et créer un nouveau SequenceGenerator avec @SequenceGenerator.
3 réponses
Oui, c'est possible. Vous pouvez remplacer le nom du générateur par défaut avec l'annotation @SequenceGenerator.
- classe de 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;
}
}
-
Séquence (SQL)
create sequence role_seq; Classe Dérivée
@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;
}
}
- Cette approche a bien fonctionné dans Hibernate 4.1.x, mais ce n'est pas le cas dans EclipseLink 2.X.
Modifier
- selon le commentaire, il semble fonctionner avec EclipseLink 2.6.1-RC1.
Dans JPA qui ne peut pas être fait avec des annotations. L'Annotation elle-même ne peut pas être remplacée. Entity hérite de toutes les informations de mappage de MappedSuperClass . Il n'y a que deux annotations qui peuvent être utilisées pour redéfinir les mappages hérités de la superclasse mappée:
- AttributeOverride pour remplacer les mappages de colonnes et
- AssociationOverride{[2] } pour remplacer les colonnes de jointure / table.
Aucun d'entre eux n'aide avec GeneratedValue.
Avec EclipseLink, vous pouvez utiliser un Customizer. DescriptorCustomizer interface définit un moyen de personnaliser toutes les informations sur un descripteur jpa (aka une entité persistante).
public class SequenceCustomizer implements DescriptorCustomizer {
@Override
public void customize(ClassDescriptor descriptor) throws Exception {
descriptor.setSequenceNumberName(descriptor.getTableName());
}
}
Et dans votre superclasse mappée:
@MappedSuperclass
@Customizer(SequenceCustomizer.class)
public abstract class AbstractEntity implements Serializable {
...
}