2015-06-02 7 views
2

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

Я написал JPA EntityManagerProvider недавно с использованием EJB:

EntityManagerProviderBean.java

@Stateless 
public class EntityManagerProviderBean { 

    @PersistenceContext(unitName="PU1") 
    private EntityManager entityManager1; 

    @PersistenceContext(unitName="PU2") 
    private EntityManager entityManager2; 

    public EntityManager getEntityManager() { 
     return (...) ? entityManager1: entityManager2; 
    } 
} 

И тогда, конечно, я могу привнести EJB, где они необходимы, как это:

UserFacade. java

@Stateless 
public class UserFacade { 

    @EJB 
    private EntityManagerProviderBean emProvider; 
    private EntityManager em = emProvider.getEntityManager(); 

    ... 
} 

Теперь я пытаюсь сделать что-то подобное с помощью Spring, используя аннотации и ничего не делая в XML. Кажется, я не могу понять, как внедрить EntityManager. Все, что я делаю, приводит к исключению NullPointerException. Например, я попытался впрыснуть EntityManager вручную, не полагаясь на мою EntityManagerProviderBean, как это:

UserFacadeSpring.java

public class UserFacadeSpring { 

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

    ... 
} 

Но это дает мне NullPointerException. Таким образом, EntityManager не вводится вообще, и я не уверен, что случилось.

Так два вопроса в основном:

  1. Как можно впрыскивать EntityManager с помощью Spring?
  2. Как использовать существующий EntityManagerProviderBean EJB весной? Какие изменения мне нужно сделать?

Любая помощь в этом вопросе будет принята с благодарностью. Как вы можете сказать, я полный ном к весне. Я попытался прочитать гида, но сейчас все пролетает над моей головой. Я действительно пытался сделать что-то наполовину испеченное, но это тоже не сработало (я либо получаю NullPointerException, либо BeanNotFoundException, я, должно быть, использовал каждую комбинацию @Component, @Bean, @Autowired аннотации, которые я думаю!):

EntityManagerProviderSpring.java

@Component 
public class EntityManagerProviderSpring { 

    @PersistenceContext(unitName="PU1") 
    private EntityManager entityManager1; 

    @PersistenceContext(unitName="PU2") 
    private EntityManager entityManager2; 

    @Bean 
    public EntityManager getEntityManager() { 
     return (...) ? entityManager1: entityManager2; 
    } 
} 

Main.java

public class Main { 
    public static void main(String[] args) { 

    ApplicationContext context = new AnnotationConfigApplicationContext(EntityManagerProviderSpring.class); 
    EntityManagerProviderSpring emProvider = context.getBean(EntityManagerProviderSpring.class); 
    EntityManager em = emProvider.getEntityManager(); 

    ... 
} 

Спасибо!

EDIT: Я использую Hibernate с JPA и следующий мой persistence.xml файл:

<?xml version="1.0" encoding="UTF-8"?> 
<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"> 
    <persistence-unit name="PU1" transaction-type="RESOURCE_LOCAL"> 
    <provider>org.hibernate.ejb.HibernatePersistence</provider> 
    <class>...</class> 
    <properties> 
     <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/db1?zeroDateTimeBehavior=convertToNull"/> 
     <property name="javax.persistence.jdbc.user" value="pu1_username"/> 
     <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/> 
     <property name="javax.persistence.jdbc.password" value="pu1_pwd"/> 
     <property name="hibernate.cache.provider_class" value="org.hibernate.cache.NoCacheProvider"/> 
    </properties> 
    </persistence-unit> 
    <persistence-unit name="PU2" transaction-type="RESOURCE_LOCAL"> 
    ... 
    </persistence-unit> 
</persistence> 
+0

В основном вы спрашиваете, как настроить весну, s o что он вводит несколько PersistenceContexts. Google для «двух главных менеджеров сущностей». –

+0

Спасибо, но есть вещи, которые не имеют смысла. Должен ли быть какой-то файл context.xml, описывающий бобы? Я использую Hibernate с JPA2 и имею файл persistence.xml, где определяется источник данных, поэтому я бы хотел, чтобы этого было достаточно? –

+0

Этот материал довольно простой. Взгляните на весенние документы. – atamanroman

ответ

3

Чтобы иметь точно такую ​​же функциональность на уровне инжекции зависимость, что невозможно отобразить без гражданства EJB компонент в весенний боб.

EJB @Singleton -> Spring @Component (или @Service или @Controller или @Repository)

EJB @Stateful -> Весна @ Компонент @ Scope ("прототип") (или @ Service @ Scope (» prototype ") или @ Controller @ Scope (" prototype ") или @ Repository @ Scope (" prototype "))

EJB @Stateless -> НЕ СУЩЕСТВУЕТ В ВЕСНА.

Необслуживаемые бобы очень удобны для этого многократного контекста персистентности ... Однако, поскольку Spring не предлагает фасол без состояния. Вы должны использовать пользовательскую настройку Spring для применения нескольких контекстов сохранения. Это не будет работать только с persistence.xml как EJB, к сожалению :(

Так, чтобы ответить на ваши вопросы:..

  1. Read Spring документ ... Много примеров везде Вскоре Весной 4 Java Config вы можете использовать @EnableTransactionManagement, менеджер транзакций и менеджер организация завода каждого контекста инерционности.
  2. http://docs.spring.io/spring/docs/current/spring-framework-reference/html/ejb.html. Это, как вы это делаете. Не хороший способ, так как с помощью JNDI, но это решение ...
Смежные вопросы