Если не существует имя транзакции - PullRequest
5 голосов
/ 12 июня 2010

Я пробую Spring 3 (.0.2.RELEASE) и JPA2 и Hibernate 3.5.1-Final ... Меня огорчает то, что Spring, кажется, принимает только диспетчер транзакций с именем "actionManager "

Если я не назову его «actionManager », Spring выдаст NoSuchBeanDefinitionException: ни один бин с именем «actionManager» не определен.

Вот мой конфиг:

<context:component-scan base-package="destiny.data.mining"/>

<context:annotation-config/>

<bean id="miningEntityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
  <property name="persistenceUnitName" value="mining"/>
</bean>

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

<tx:advice id="txAdviceMining" transaction-manager="miningTransactionManager">
  <tx:attributes>
    <tx:method name="get*"    read-only="true"/>
    <tx:method name="save*"   propagation="REQUIRED"/>
    <tx:method name="update*" propagation="REQUIRED"/>
    <tx:method name="delete*" propagation="REQUIRED"/>
    <tx:method name="*" propagation="SUPPORTS" read-only="true"/>
  </tx:attributes>
</tx:advice>  

<aop:config>
  <aop:pointcut id="methods" expression="execution(* destiny.utils.AbstractDao+.*(..))"/>
  <aop:advisor advice-ref="txAdviceMining" pointcut-ref="methods"/>
</aop:config>

<tx:annotation-driven transaction-manager="miningTransactionManager"/>  

В этой конфигурации фабрика Entity Manager не обязательно называется «entityManagerFactory», а «txAdvice» не также обязательно называется «txAdvice». Но я не знаю, почему Spring требует менеджера транзакций с именем "actionManager "?

Есть ли способ не назвать менеджера транзакций "actionManager "? (Я использую несколько конфигурационных файлов Spring, поэтому я стараюсь изо всех сил, чтобы избежать конфликта имен)

тестовый код:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:mining.xml"})
public class MiningPersonDaoTest
{
  @Inject
  private EntityManagerFactory miningEntityManagerFactory;

  @Inject
  private MiningPersonDao miningPersonDao;


  @Transactional
  @Test
  public void testUpdate()
  {
    MiningPerson p = miningPersonDao.get(42L);
    p.setLocationName("OOXX");
    miningPersonDao.update(p);
    System.out.println(p);
  }
}

Ответы [ 2 ]

7 голосов
/ 12 июня 2010

Насколько я понимаю, в контексте модульных тестов (TransactionalTestExecutionListener) код, который в противном случае ищет менеджер транзакций, не используется (TransactionInterceptor#determineTransactionManager ).

Вы можете попытаться аннотировать ваш тестовый класс с помощью @TransactionConfiguration, который принимает атрибут transactionManager. Не самый элегантный способ, но, возможно, лучший вариант на данный момент.

3 голосов
/ 30 июня 2013

Сегодня я столкнулся с той же проблемой, когда пробовал очень тривиальный пример Spring-Data JPA. Я дал пользовательское имя для менеджера транзакций, "dmTransactionManager". Чтобы исправить это, я должен был указать это, я должен был указать это как ниже:

<jpa:repositories base-package="com.my.repository" transaction-manager-ref="dmTransactionManager"/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...