2014-05-19 10 views
6

Da doc riferimento primaverafa primavera @transaction lavoro su un metodo concreto di classe astratta

Primavera consiglia di annotare solo classi concrete (e metodi di classi concrete) con l'annotazione @Transactional, al contrario di annotazione interfacce. È certamente possibile posizionare l'annotazione @Transactional su un'interfaccia (o un metodo di interfaccia), ma funziona solo come ci si aspetterebbe se si utilizzano proxy basati su interfaccia. Il fatto che le annotazioni Java non siano ereditate dalle interfacce significa che se si utilizzano i proxy basati sulla classe (proxy-target-class = "true") o l'aspetto basato sulla tessitura (mode = "aspectj"), le impostazioni della transazione non sono riconosciuti dall'infrastruttura di proxy e tessitura e l'oggetto non verrà incapsulato in un proxy transazionale, il che sarebbe decisamente negativo.

Sebbene parli solo di interfacce, anche le classi astratte sono considerate non concrete.

Quindi, se ho una classe astratta

public abstract class BaseService{ 
//here is a concrete method 
@Transactional 
public void updateData{ 
//do stuff using dao layer 
} 

e una classe concreta che estende la classe

public class SpecialService extends BaseService{ 
//body of class 
} 

Ora, se io chiamo specialService.updateData() dalla mia classe di controllo sarà transazionale?

+0

Cosa succede quando si prova? –

risposta

8

Concessione che si è in realtà configurato correttamente la gestione delle transazioni di Primavera, utilizzando @Transactional su una superclasse astratta volontà lavoro, dal momento che @Transactional è a sua volta annotato con @Inherited e da esso è Javadoc abbiamo:

Indica che un'annotazione il tipo viene automaticamente ereditato. Se un Ereditato meta-annotazione è presente su un tipo di annotazione dichiarazione, e l'utente interroga il tipo di annotazione su una dichiarazione di classe , e la dichiarazione della classe non ha alcuna annotazione per questo tipo , quindi superclasse della classe saranno automaticamente interrogati per il tipo di annotazione. Questo processo verrà ripetuto finché non viene trovata un'annotazione per questo tipo oppure la parte superiore della gerarchia di classi (Object) è stata raggiunta con lo . Se nessuna superclasse ha un'annotazione per questo tipo, la query indicherà che la classe in questione non ha tale annotazione.

Si noti che questo tipo di meta-annotazione non ha effetto se il tipo annotato viene utilizzato per annotare qualcosa di diverso da una classe. Si noti inoltre che questa metanotazione consente di ereditare le annotazioni solo dalle annotazioni dalle superclassi ; le annotazioni sulle interfacce implementate non hanno alcun effetto.

Per effettivamente vedere che @Transactional è annotata con @Inherited check-out è Javadoc

Problemi correlati