2017-09-20 4 views
1

Je souhaite créer une annotation pour un champ Entité JPA qui résume certaines autres annotations. Ceci est l'annotation je voudrais créer:Annotation Java qui résume les autres annotations

import java.lang.annotation.ElementType; 
import java.lang.annotation.Retention; 
import java.lang.annotation.RetentionPolicy; 
import java.lang.annotation.Target; 

import javax.persistence.AttributeOverride; 
import javax.persistence.AttributeOverrides; 
import javax.persistence.Column; 
import javax.persistence.Embedded; 

@Target(value = {ElementType.FIELD, ElementType.METHOD}) 
@Retention(RetentionPolicy.RUNTIME) 
@Embedded 
@AttributeOverrides({ 
     @AttributeOverride(name = "createdAt", column = @Column(name = "created_at", columnDefinition = "TIMESTAMP WITH TIME ZONE")), 
     @AttributeOverride(name = "lastChangedAt", column = @Column(name = "last_changed_at", columnDefinition = "TIMESTAMP WITH TIME ZONE")), 
     @AttributeOverride(name = "lastChangedBy", column = @Column(name = "last_changed_by")), 
     @AttributeOverride(name = "createdBy", column = @Column(name = "created_by")) }) 
public @interface EmbeddAdministrativeData { 

} 

Mais cela donne une erreur de syntaxe à @Embedded parce que la cible de @Embedded est Champ et méthode. Si je supprime @Embedded et l'utilise séparément, l'annotation @EmbeddAdministrativeData est ignorée. Quelle serait la bonne façon de faire cela? Le JPA 2.2 prend en charge les "méta-annotations" selon this link

+1

Je ne pense pas que je suis. Vous avez créé votre propre annotation et vous demandez comment faire en sorte que Hibernate le reconnaisse? La réponse, je le crains, c'est que vous ne pouvez pas - à moins que vous ne créiez votre propre fourchette d'Hibernate. – crizzis

Répondre

1

Ensuite, il s'agit de savoir si votre fournisseur JPA prend en charge JPA 2.2 ou non (celui que j'utilise, que ces documents sont pour, par exemple).

+0

C'est exactement ce que je voudrais faire. Voir mon code ci-dessus. Mais '@ Embedded' donne une erreur de syntaxe car sa cible est un champ ou une méthode. Et si je n'utilise que '@AttributeOverrides ...' dans ma méta-annotation, il est simplement ignoré lors de l'exécution. – Alex

+0

Sa cible n'est pas simplement FIELD/METHOD dans JPA 2.2, d'où la raison pour laquelle ils peuvent être utilisés par un fournisseur JPA 2.2 valide. https://github.com/datanucleus/javax.persistence/blob/master/src/main/java/javax/persistence/Embedded.java#L49 –