Весной какой код используется для вставки значения для аннотированных переменных @PersistenceContext? - PullRequest
1 голос
/ 17 декабря 2009

Используя объект ClassPathXmlApplicationContext, я хочу получить тот же EntityManager, который используется другими частями приложения, которые вводят его через:

@PersistenceContext(unitName="accessControlDb") private EntityManager em;

Используя ctx.getBean ("access-emf"), я могу получить EntityManagerFactory, который определен в applicationContext.xml. Используя это, я могу создать новый EntityManager, но не могу получить существующий EntityManager, используемый остальной частью приложения.

Я просто не могу понять, какой код выполняется, чтобы ввести значение для аннотации @PersistenceContext.

<bean id="jotm" class="org.springframework.transaction.jta.JotmFactoryBean"/>


<bean id="innerNgsdpDataSource" class="org.enhydra.jdbc.standard.StandardXADataSource">
    <property name="driverName" value="${ngsdp.jdbc.driver}"/>
    <property name="url" value="${ngsdp.jdbc.url}"/>
    <property name="user" value="${ngsdp.jdbc.username}"/>
    <property name="password" value="${ngsdp.jdbc.password}"/>
    <property name="transactionManager" ref="jotm"/>
</bean>

<bean id="ngsdpDataSource" class="org.enhydra.jdbc.pool.StandardXAPoolDataSource">
    <property name="transactionManager" ref="jotm"/>
    <property name="dataSource" ref="innerNgsdpDataSource"/>
    <property name="user" value="${ngsdp.jdbc.username}"/>
    <property name="password" value="${ngsdp.jdbc.password}"/>
    <property name="maxSize" value="4"/>

    <property name="checkLevelObject" value="2"/>
    <property name="jdbcTestStmt" value="select 1 from dual"/>
</bean>

<bean id="myEmf" name="moservices" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="dataSource" ref="ngsdpDataSource"/>
    <property name="persistenceXmlLocation" value="WEB-INF/moservices-persistence.xml" />
    <property name="jpaVendorAdapter" ref="hibernate_jpa_vendor_adapter" />
    <property name="jpaPropertyMap" ref="jpa_property_map"/>
    <property name="jpaDialect" ref="hibernate_jpa_dialect"/>
</bean>

1 Ответ

2 голосов
/ 17 декабря 2009

Если вы используете пружинные транзакции, вы можете получить текущий EntityManager, позвонив по номеру

EntityManagerFactory emFactory = ctx.getBean("access-emf");
EntityManagerHolder emHolder = 
        (EntityManagerHolder) TransactionSynchronizationManager.getResource(emFactory);
EntityManager em = emHolder.getEntityManager();

Чаще всего это текущий EntityManager. Но этого следует избегать (за исключением, возможно, юнит-тестов), как указано в весенних документах:

Используется кодом управления ресурсами, но не типичным кодом приложения

Другой подход может заключаться в том, чтобы перехватывать ваши сервисные вызовы с помощью Spring AOP, вводить @PersistenceContext в рекомендации и устанавливать в ThreadLocal вашей. Позже вы можете получить его от этого ThreadLocal.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...