Domanda

Sono nuovo di primavera e mi chiedo se il suo possibile utilizzare numerosi gestori di transazioni nella stessa applicazione?

Ho due strati di accesso ai dati - uno per entrambi i database. Mi chiedo, come si fa su come utilizzare i gestori delle transazioni per uno uno strato e diverso gestore delle transazioni per l'altro strato. Non ho bisogno di effettuare operazioni in entrambi i database - ancora. Ma ho bisogno di eseguire le operazioni su ogni database singolarmente. Ho creato un'immagine per aiuto contorno mio problema:

alt text

Questa è la mia configurazione contesto di applicazione:

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-3.0.xsd
        http://www.springframework.org/schema/tx
        http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">

    <context:component-scan base-package="cheetah.repositories" />
    <tx:annotation-driven />

    <bean id="entityManagerFactory"
        class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean">
        <property name="persistenceUnitName" value="accounts" />
    </bean>

    <bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />

    <bean id="transactionManager"
        class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="entityManagerFactory" ref="entityManagerFactory" />
    </bean>

</beans>

Ecco un esempio che utilizza questa configurazione:

@Repository
public class JpaAccountRepository implements AccountRepository {

    @PersistenceContext(unitName = "cheetahAccounts")
    private EntityManager accountManager;

    @Override
    @Transactional
    public Account findById(long id) {

        Account account = accountManager.find(Account.class, id);
        return account;
    }
}

Quindi, per il repository conto, voglio usare una fabbrica di un'entità responsabile con l'unità di persistenza insieme ai conti. Tuttavia, con il mio BusinessData Repository, voglio usare una fabbrica di un'entità responsabile di un'unità di persistenza diverso. Dal momento che posso definire unico gestore di fagioli una transazione, come posso andare sull'utilizzo di diversi gestori di transazioni per i diversi repository?

Grazie per qualsiasi aiuto.

È stato utile?

Soluzione

Quando si utilizza un'annotazione @Transactional, puoi specificano il gestore delle transazioni di utilizzare aggiungendo un set di attributi a un nome di fagioli o di qualificazione. Ad esempio, se il contesto di applicazione definisce più gestori di transazioni con le qualificazioni:

<bean id="transactionManager1"
    class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="entityManagerFactory1" />
    <qualifier value="account"/>
</bean>

<bean id="transactionManager2"
    class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="entityManagerFactory2" />
    <qualifier value="businessData"/>
</bean>

È possibile utilizzare il qualificatore per specificare il gestore delle transazioni da utilizzare:

public class TransactionalService {

    @Transactional("account")
    public void setSomethingInAccount() { ... }

    @Transactional("businessData")
    public void doSomethingInBusinessData() { ... }
}

Altri suggerimenti

Questa voce Primavera Jira discute la questione un po ':

https://jira.spring.io/browse/SPR-3955

penso che potrebbe essere uno gestore di transazioni per connessione se non si sta usando commit a due fasi. Hai solo bisogno di creare due gestori di transazioni e iniettare loro la connessione appropriata.

Ma devo porre la domanda: perché pensi che avete bisogno di due gestori di transazioni? Si può avere più di una connessione al database. I DAO che utilizzano le connessioni possono e devono essere istanziati da diversi servizi, ognuno dei quali può essere annotato con le proprie impostazioni transazionali. Un manager può ospitare sia. Perché pensi che avete bisogno di due?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top