Конфигурация Multi Transaction Manager Spring с аннотациями - PullRequest
1 голос
/ 09 января 2012

Существует два компонента JpaTransactionManager.

Может управлять ими с помощью обозначения квалификатора.

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

    <qualifier value="first"/>
</bean>

<bean id="transactionManagerRelative" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="relative"/>
    <qualifier value="second"/>
</bean>

Код Java:

@Transactional("first")
public String saveWork(){

    em1.persist(work);
    work = (Work) ctx.getBean("work");
    return "/workLists.xhtml";
}

@Transactional("second")
public String saveEvent(){

    em2.persist(event);
    event = (Event) ctx.getBean("event");

    return "/eventLists.xhtml";
}

Проблема в том, как мнеиспользовать уровень изоляции или readOnly присваивания?Аннотации @Qualifier не работают:

@Transactional(isolation = Isolation.SERIALIZABLE, propagation=Propagation.REQUIRED, readOnly = false)
@Qualifier("first")
public String saveWork(){

    em1.persist(work);
    work = (Work) ctx.getBean("work");
    return "/workLists.xhtml";
}

@Transactional(isolation = Isolation.SERIALIZABLE, propagation=Propagation.REQUIRED, readOnly = false)
@Qualifier("second")
public String saveEvent(){

    em2.persist(event);
    event = (Event) ctx.getBean("event");

    return "/eventLists.xhtml";
}

Как я могу решить эту проблему?

1 Ответ

0 голосов
/ 09 января 2012

Вы должны поместить аннотацию @Qualifier в элемент, который является TransactionManager, а не в метод, который его использует.

В следующем предположении em1 и em2 являются TransactionManager определено в конфигурации пружины выше.

@Autowired
@Qualifier("first")
private TransactionManager em1;

@Autowired
@Qualifier("second")
private TransactionManager em2;

@Transactional(isolation = Isolation.SERIALIZABLE, propagation=Propagation.REQUIRED, readOnly = false)
public String saveWork(){

    em1.persist(work);
    work = (Work) ctx.getBean("work");
    return "/workLists.xhtml";
}

@Transactional(isolation = Isolation.SERIALIZABLE, propagation=Propagation.REQUIRED, readOnly = false)
public String saveEvent(){

    em2.persist(event);
    event = (Event) ctx.getBean("event");

    return "/eventLists.xhtml";
}
...