2012-05-31 9 views
5

In alcune annotazioni APP che voglio usare i nomi dei campi direttamente nel codice al posto di soggetti a errori stringhe:Come si generano automaticamente nomi di colonne come stringhe finali statiche nel metamodello JPA 2.0?

@javax.persistence.OrderBy(value = User_.registrationDate.getName()) 
public List<PlugConfig> getPlugConfigs() { ... } 

ma quanto sopra non viene compilato perché per ottenere il nome devo usare la funzione che non è costante espressione (utente_ è generato JPA @StaticMetamodel).

È possibile utilizzare metamodel per questo in qualsiasi modo o devo attenermi alle costanti di stringa dirette? C'è un modo per generare automaticamente tali costanti di stringa per metamodel? (Sto usando Maven-processor-plugin per la generazione)

risposta

0

Non ho provato, ma da quello che ho letto in un completamente altro contesto (non JPA) si potrebbe provare:

  • Specificare un costume annotazione (RetentionPolicy.SOURCE) e annotare le vostre classi di entità in questione (o si può solo contare su l'annotazione @Entity)
  • Scrivi un processore annotazione, che scrive una classe con i campi statici

Eg

public class UserConstants{ 
    public static final String REGISTRATION_DATE = User_.registrationDate.getName(); 
} 

È solo un pensiero. Non so se si adatta a questo caso.

+0

Penso che questa sia attualmente la soluzione più semplice attualmente disponibile. – vinga

5

Ora ho due campi per ogni campo nella mia classe metamodello, ad esempio:

public static final String _registrationDate="registrationDate"; 
public static volatile SingularAttribute<User, Date> registrationDate; 

per ottenere questo lavoro ho riutilizzato il codice da JPAMetaModelEntityProcessor (sfortunatamente non c'era problema con semplicemente estendendo questa classe). ho aggiunto questo metodo:

private void addFieldsNamesAsStrings(MetaEntity entity) { 
    if (entity instanceof AnnotationMetaEntity) { 

     AnnotationMetaEntity aentity = (AnnotationMetaEntity) entity; 
     List<MetaAttribute> newMembers = new ArrayList<MetaAttribute>(); 
     for (final MetaAttribute ma : entity.getMembers()) { 

      MetaAttribute nma = new AnnotationMetaAttribute(aentity, null, 
        null) { 
       public String getDeclarationString() { 
        return new StringBuilder() 
          .append("public static final String ") 
          .append(getPropertyName()).append("=\""+ma.getPropertyName()+"\";") 
          .toString(); 
       } 

       @Override 
       public String getPropertyName() { 
        return "_"+ma.getPropertyName(); 
       } 

       @Override 
       public String getMetaType() { 

        return null; 
       } 

      }; 
      newMembers.add(nma); 

      aentity.mergeInMembers(newMembers); 
     } 
    } 

} 

che ho invocato prima di ogni occorrenza di

ClassWriter.writeFile(entity, context); 

corrispondente configurazione di Maven:

 <plugin> 
      <groupId>org.bsc.maven</groupId> 
      <artifactId>maven-processor-plugin</artifactId> 
      <executions> 
       <execution> 
        <id>process</id> 
        <goals> 
         <goal>process</goal> 
        </goals> 
        <phase>generate-sources</phase> 
        <configuration> 
         <processors> 
          <processor> 
           com.company.MyProcessor 
        </processor> 
         </processors> 
         <outputDirectory>target/modelgen/src/main/java</outputDirectory> 
        </configuration> 
       </execution> 
      </executions> 
     </plugin> 
+0

Grazie per la condivisione. – Puce

Problemi correlati