2012-05-15 1 views
17

I Transaktions Anmerkungen für die Transaktion Spring Framework bin mit der Verwaltung und ich habe eine abstrakte Klasse kommentiert @Transactional wie unten zu sehen:Ist es möglich, für die Klasse der Annotations der Superklasse erbt

package org.tts.maqraa.service; 

import java.util.Collection; 
import java.util.Iterator; 
import java.util.List; 
import java.util.Set; 

import javax.persistence.EntityManager; 
import javax.persistence.EntityNotFoundException; 
import javax.persistence.PersistenceContext; 
import javax.persistence.PersistenceContextType; 
import javax.persistence.Query; 

import org.springframework.transaction.annotation.Propagation; 
import org.springframework.transaction.annotation.Transactional; 

import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 

/** 
* Parts of this code have been copied from JARVANA site. 
* 
* @author Younis alomoush 
* 
*/ 
@Transactional(propagation=Propagation.REQUIRED) 
public abstract class AbstractMaqraaService implements MaqraaService { 


    private Logger logger = LoggerFactory.getLogger(this.getClass()); 


    private int defaultMaxResults = DEFAULT_MAX_RESULTS; 

    @PersistenceContext(type=PersistenceContextType.TRANSACTION) 
    private EntityManager em; 
    /** 
    * The {@link EntityManager} which is used by all query manipulation and 
    * execution in this DAO. 
    * 
    * @return the {@link EntityManager} 
    */ 
    public EntityManager getEntityManager(){ 

     return em; 
    } 

    /* 
    * (non-Javadoc) 
    * 
    * @see org.skyway.spring.util.dao.JpaDao#getTypes() 
    */ 
    public abstract Set<Class<?>> getTypes(); 

    /* 
    * (non-Javadoc) 
    * 
    * @see org.skyway.spring.util.dao.JpaDao#store(java.lang.Object) 
    */ 
    @Transactional(propagation = Propagation.REQUIRED) 
    public <T extends Object> T store(T toStore) { 
     return getEntityManager().merge(toStore); 

    } 

    /* 
    * (non-Javadoc) 
    * 
    * @see org.skyway.spring.util.dao.JpaDao#remove(java.lang.Object) 
    */ 
    @Transactional(propagation = Propagation.REQUIRED) 
    public void remove(Object toRemove) { 
     toRemove = getEntityManager().merge(toRemove); 
     getEntityManager().remove(toRemove); 
    } 

    /* 
    * (non-Javadoc) 
    * 
    * @see org.skyway.spring.util.dao.JpaDao#flush() 
    */ 
    @Transactional(propagation = Propagation.REQUIRED) 
    public void flush() { 
     getEntityManager().flush(); 
    } 

    /* 
    * (non-Javadoc) 
    * 
    * @see org.skyway.spring.util.dao.JpaDao#refresh(java.lang.Object) 
    */ 
    @Transactional(propagation = Propagation.SUPPORTS) 
    public void refresh(Object o) { 
     try { 
      if (o != null) { 
       if (o instanceof java.util.Collection) { 
        for (Iterator<?> i = ((Collection<?>) o).iterator(); i 
          .hasNext();) { 
         try { 
          refresh(i.next()); 
         } catch (EntityNotFoundException x) { 
          // This entity has been deleted - remove it from the 
          // collection 
          i.remove(); 
         } 
        } 
       } else { 
        if (getTypes().contains(o.getClass())) { 
         getEntityManager().refresh(o); 
        } 
       } 
      } 
     } catch (EntityNotFoundException x) { 
      // This entity has been deleted 
     } 
    } 

    /* 
    * (non-Javadoc) 
    * 
    * @see org.skyway.spring.util.dao.JpaDao#setDefaultMaxResults(int) 
    */ 
    @Transactional(propagation = Propagation.SUPPORTS) 
    public void setDefaultMaxResults(int defaultMaxResults) { 
     this.defaultMaxResults = defaultMaxResults; 
    } 

    /* 
    * (non-Javadoc) 
    * 
    * @see org.skyway.spring.util.dao.JpaDao#getDefaultMaxResults() 
    */ 
    public int getDefaultMaxResults() { 
     return defaultMaxResults; 
    } 

    /* 
    * (non-Javadoc) 
    * 
    * @see 
    * org.skyway.spring.util.dao.JpaDao#executeQueryByNameSingleResult(java 
    * .lang.String) 
    */ 
    @SuppressWarnings("unchecked") 
    public <T extends Object> T executeQueryByNameSingleResult(String queryName) { 
     return (T) executeQueryByNameSingleResult(queryName, (Object[]) null); 
    } 

    /* 
    * (non-Javadoc) 
    * 
    * @see 
    * org.skyway.spring.util.dao.JpaDao#executeQueryByNameSingleResult(java 
    * .lang.String, java.lang.Object[]) 
    */ 

    @SuppressWarnings("unchecked") 
    public <T extends Object> T executeQueryByNameSingleResult(
      String queryName, Object... parameters) { 
     Query query = createNamedQuery(queryName, DEFAULT_FIRST_RESULT_INDEX, 
       1, parameters); 
     return (T) query.getSingleResult(); 
    } 

    /* 
    * (non-Javadoc) 
    * 
    * @see 
    * org.skyway.spring.util.dao.JpaDao#executeQueryByName(java.lang.String) 
    */ 
    public <T extends Object> List<T> executeQueryByName(String queryName) { 
     return executeQueryByName(queryName, DEFAULT_FIRST_RESULT_INDEX, 
       getDefaultMaxResults()); 
    } 

    /* 
    * (non-Javadoc) 
    * 
    * @see 
    * org.skyway.spring.util.dao.JpaDao#executeQueryByName(java.lang.String, 
    * java.lang.Integer, java.lang.Integer) 
    */ 

    public <T extends Object> List<T> executeQueryByName(String queryName, 
      Integer firstResult, Integer maxResults) { 
     return executeQueryByName(queryName, firstResult, maxResults, 
       (Object[]) null); 
    } 

    /* 
    * (non-Javadoc) 
    * 
    * @see 
    * org.skyway.spring.util.dao.JpaDao#executeQueryByName(java.lang.String, 
    * java.lang.Object[]) 
    */ 

    public <T extends Object> List<T> executeQueryByName(String queryName, 
      Object... parameters) { 
     return executeQueryByName(queryName, DEFAULT_FIRST_RESULT_INDEX, 
       getDefaultMaxResults(), parameters); 
    } 

    /* 
    * (non-Javadoc) 
    * 
    * @see 
    * org.skyway.spring.util.dao.JpaDao#executeQueryByName(java.lang.String, 
    * java.lang.Integer, java.lang.Integer, java.lang.Object[]) 
    */ 
    @SuppressWarnings("unchecked") 
    public <T extends Object> List<T> executeQueryByName(String queryName, 
      Integer firstResult, Integer maxResults, Object... parameters) { 
     Query query = createNamedQuery(queryName, firstResult, maxResults, 
       parameters); 
     return query.getResultList(); 
    } 

    /* 
    * (non-Javadoc) 
    * 
    * @see org.skyway.spring.util.dao.JpaDao#createNamedQuery(java.lang.String, 
    * java.lang.Integer, java.lang.Integer) 
    */ 

    public Query createNamedQuery(String queryName, Integer firstResult, 
      Integer maxResults) { 
     return createNamedQuery(queryName, firstResult, maxResults, 
       (Object[]) null); 
    } 

    /* 
    * (non-Javadoc) 
    * 
    * @see org.skyway.spring.util.dao.JpaDao#createNamedQuery(java.lang.String, 
    * java.lang.Integer, java.lang.Integer, java.lang.Object[]) 
    */ 

    public Query createNamedQuery(String queryName, Integer firstResult, 
      Integer maxResults, Object... parameters) { 
     Query query = getEntityManager().createNamedQuery(queryName); 
     if (parameters != null) { 
      for (int i = 0; i < parameters.length; i++) { 
       query.setParameter(i + 1, parameters[i]); 
      } 
     } 

     query.setFirstResult(firstResult == null || firstResult < 0 ? DEFAULT_FIRST_RESULT_INDEX 
       : firstResult); 
     if (maxResults != null && maxResults > 0) 
      query.setMaxResults(maxResults); 

     return query; 
    } 

    /* 
    * (non-Javadoc) 
    * 
    * @see org.skyway.spring.util.dao.JpaDao#executeQuery(java.lang.String, 
    * java.lang.Integer, java.lang.Integer, java.lang.Object[]) 
    */ 
    @SuppressWarnings("unchecked") 
    public <T extends Object> List<T> executeQuery(String queryString, 
      Integer firstResult, Integer maxResults, Object... parameters) { 
     Query query = createQuery(queryString, firstResult, maxResults, 
       parameters); 
     return query.getResultList(); 
    } 

    /* 
    * (non-Javadoc) 
    * 
    * @see org.skyway.spring.util.dao.JpaDao#executeQuery(java.lang.String, 
    * java.lang.Object[]) 
    */ 
    @SuppressWarnings("unchecked") 
    public <T extends Object> List<T> executeQuery(String queryString, 
      Object... parameters) { 
     Query query = createQuery(queryString, DEFAULT_FIRST_RESULT_INDEX, 
       getDefaultMaxResults(), parameters); 
     return query.getResultList(); 
    } 

    /* 
    * (non-Javadoc) 
    * 
    * @see 
    * org.skyway.spring.util.dao.JpaDao#executeQuerySingleResult(java.lang. 
    * String) 
    */ 
    @SuppressWarnings("unchecked") 
    public <T extends Object> T executeQuerySingleResult(String queryString) { 
     return (T) executeQuerySingleResult(queryString, (Object[]) null); 
    } 

    /* 
    * (non-Javadoc) 
    * 
    * @see 
    * org.skyway.spring.util.dao.JpaDao#executeQuerySingleResult(java.lang. 
    * String, java.lang.Object[]) 
    */ 
    @SuppressWarnings("unchecked") 
    public <T extends Object> T executeQuerySingleResult(String queryString, 
      Object... parameters) { 
     Query query = createQuery(queryString, DEFAULT_FIRST_RESULT_INDEX, 1, 
       parameters); 
     return (T) query.getSingleResult(); 
    } 

    /* 
    * (non-Javadoc) 
    * 
    * @see org.skyway.spring.util.dao.JpaDao#createQuery(java.lang.String, 
    * java.lang.Integer, java.lang.Integer) 
    */ 

    public Query createQuery(String queryString, Integer firstResult, 
      Integer maxResults) { 
     return createQuery(queryString, firstResult, maxResults, 
       (Object[]) null); 
    } 

    /* 
    * (non-Javadoc) 
    * 
    * @see org.skyway.spring.util.dao.JpaDao#createQuery(java.lang.String, 
    * java.lang.Integer, java.lang.Integer, java.lang.Object[]) 
    */ 
    public Query createQuery(String queryString, Integer firstResult, 
      Integer maxResults, Object... parameters) { 
     Query query = getEntityManager().createQuery(queryString); 
     if (parameters != null) { 
      for (int i = 0; i < parameters.length; i++) { 
       query.setParameter(i + 1, parameters[i]); 
      } 
     } 

     query.setFirstResult(firstResult == null || firstResult < 0 ? DEFAULT_FIRST_RESULT_INDEX 
       : firstResult); 
     if (maxResults != null && maxResults > 0) 
      query.setMaxResults(maxResults); 

     return query; 
    } 

    public final void log(LogLevel logLevel, String message, 
      Object... messageParam) { 

     switch (logLevel) { 
     case TRACE: 
      if (logger.isTraceEnabled()) { 

       logger.trace(message, messageParam); 
      } 

      break; 

     case DEBUG: 
      if (logger.isDebugEnabled()) { 

       logger.debug(message, messageParam); 
      } 
      break; 

     case INFO: 
      if (logger.isInfoEnabled()) { 

       logger.info(message, messageParam); 
      } 
      break; 

     case WARN: 
      if (logger.isWarnEnabled()) { 

       logger.warn(message, messageParam); 
      } 
      break; 

     case ERROR: 
      if (logger.isErrorEnabled()) { 

       logger.error(message, messageParam); 
      } 
      break; 

     default: 
      throw new IllegalArgumentException("Log Level is not defined: " 
        + logLevel); 

     } 

    } 

    public final void log(LogLevel logLevel, String message, Throwable throwable) { 

     switch (logLevel) { 
     case TRACE: 
      if (logger.isTraceEnabled()) { 

       logger.trace(message, throwable); 
      } 

      break; 

     case DEBUG: 
      if (logger.isDebugEnabled()) { 

       logger.debug(message, throwable); 
      } 
      break; 

     case INFO: 
      if (logger.isInfoEnabled()) { 

       logger.info(message, throwable); 
      } 
      break; 

     case WARN: 
      if (logger.isWarnEnabled()) { 

       logger.warn(message, throwable); 
      } 
      break; 

     case ERROR: 
      if (logger.isErrorEnabled()) { 

       logger.error(message, throwable); 
      } 
      break; 

     default: 
      throw new IllegalArgumentException("Log Level is not defined: " 
        + logLevel); 

     } 

    } 


    public enum LogLevel{ 

     TRACE, DEBUG, INFO, WARN, ERROR; 

    } 
} 

Auch ich habe eine andere konkrete Klasse

package org.tts.maqraa.service; 

import java.lang.annotation.Annotation; 
import java.util.HashSet; 
import java.util.List; 
import java.util.Set; 
import org.tts.maqraa.data.Student; 


public class StudentsService extends AbstractMaqraaService { 

    @Override 
    public Set<Class<?>> getTypes() { 
     Set<Class<?>> set = new HashSet<Class<?>>(); 
     set.add(Student.class); 
     return set; 
    } 

    public Student registerStudent(Student student) { 
     Annotation [] annotation = StudentsService.class.getAnnotations(); 
     System.out.println(annotation); 
     return this.store(student); 
    } 

    public Student editStudent(Student student){ 
     return this.store(student); 
    } 

    public void deregisterStudent(Student student){ 
     this.remove(student); 
    } 

    public List<Student> findAllStudents(){ 
     return this.executeQueryByName("Student.findAll"); 
    } 

} 

Wenn Sie, dass die Methode Register Schüler bemerken bereits Code zur Verfügung gestellt für die Anmerkungen zu untersuchen, wo ich die @Transactional Anmerkung wirklich finden.

Das ist ein Widerspruch, wo ich einen anderen Link über die Vererbung von Annotationen und es sagt, dass es überhaupt keine Vererbung gibt.

Bewertung Link: http://fusionsoft-online.com/articles-java-annotations.php

Kann mir jemand helfen, diesen Widerspruch zu lösen?

Antwort

14

Die Annotationsvererbung funktioniert grundsätzlich genauso wie die Vererbung von Methoden oder Feldern.

Da Sie Anmerkungen zugreifen können nur durch Reflexion, gibt es zwei grundlegende Methoden in Class:

  • getAnnotations() kehren alle Anmerkungen auf der aktuellen Klasse und ihre Superklassen
  • getDeclaredAnnotations() kehren alle Anmerkungen auf der aktuellen Klasse

das Problem der Artikel, den Sie zu verknüpften Gespräche ist, dass Method#getAnnotation(...)declaredAnnotations() der Klasse greift auf th Die Methode wurde in definiert, die, wie oben erwähnt, nur die in dieser Klasse definierten Annotationen und nicht die der Superklassen zurückgibt.

Das bedeutet, dass, wenn Sie eine der Methoden, mit @Transactional kommentierten außer Kraft setzen würden Sie die Anmerkung hinzufügen, um dort (oder wenn die Rahmenbedingungen in der Klasse Anmerkung sieht auch sollte es die @Transactional erklärt auf AbstractMaqraaService finden).

29

Ja, es ist möglich, wenn die Annotation @Inherited hinzugefügt wurde. Zum Beispiel hat die @Transactional Annotation @Inherited.

Aus der Dokumentation:

Zeigt an, dass ein Annotationstyp automatisch vererbt wird. Wenn eine vererbte Metaanmerkung für eine Anmerkung Deklaration vorhanden ist und der Benutzer den Anmerkungstyp für eine Deklaration der Klasse abfragt und die Klassendeklaration für diesen -Typ keine Anmerkung enthält, wird die Oberklasse der Klasse automatisch abgefragt der Annotationstyp. Dieser Prozess wird wiederholt, bis eine Annotation für diesen Typ gefunden wird oder der Anfang der Klassenhierarchie (Object) erreicht ist. Wenn keine Superklasse eine Annotation für diesen Typ aufweist, gibt die Abfrage an, dass die fragliche Klasse keine solche Annotation hat.

Beachten Sie, dass dieser Meta-Annotation-Typ keine Auswirkung hat, wenn der annotierte -Typ verwendet wird, um etwas anderes als eine Klasse zu kommentieren. Beachten Sie auch, dass diese Meta-Annotation nur dazu führt, dass Annotationen von Superklassen vererbt werden; Anmerkungen zu implementierten Schnittstellen haben keine Auswirkung.

Docs von @Transactional:

@Target(value={METHOD,TYPE}) 
@Retention(value=RUNTIME) 
@Inherited 
@Documented 
public @interface Transactional 

Off topic: Sie können nicht eine Anmerkung obwohl in Java Subtyp.

+0

Beachten Sie, dass @Inherited nur funktioniert, wenn es auf eine Klasse angewendet wird (keine Methode oder Schnittstelle) – AlexO