2015-06-02 59 views
2

過去幾天,我一直在牆上敲打我的頭,試圖讓這個工作,但我一直沒有能力。具有多個@PersistenceContext的@Stateless EJB的Spring等價物

我寫了一個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. 我如何注入使用Spring的EntityManager?
  2. 如何在Spring中使用現有的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(); 

    ... 
} 

謝謝!

編輯:我使用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

基本上你在問,如何配置spring,s它注入多個PersistenceContext。谷歌爲「春天的兩個實體經理」。 –

+0

謝謝,但仍然有些東西沒有道理。是否絕對需要某種描述bean的context.xml文件?我在JPA2中使用Hibernate,並且有一個persistence.xml文件,其中定義了數據源,所以我會盡管這足夠了? –

+0

這東西是相當基本的。看看春天的文檔。 – atamanroman

回答

3

要對依賴注入水平完全相同的功能,這是不可能映射無狀態EJB的bean春天的豆子。

EJB @Singleton - >彈簧@Component(或@Service或@Controller或@Repository)

EJB @Stateful - >彈簧@元器件@範圍( 「原型」)(或服務@ @範圍(」原型「)或@ Controller @ Scope(」prototype「)或@ Repository @ Scope(」prototype「))

EJB @Stateless - >不存在於SPRING中。

無狀態bean對於這個多持久化上下文非常方便...但是,由於Spring不提供無狀態bean。您必須使用自定義Spring設置來應用多個持久性上下文。它不會只像的persistence.xml EJB,不幸的是:(工作

因此,要回答你的問題:。

  1. 瀏覽Spring文檔......的例子隨處可見大量不久,在Spring的Java 4配置可以使用@EnableTransactionManagement,一個事務管理器和每個持久化上下文的實體管理器工廠。
  2. http://docs.spring.io/spring/docs/current/spring-framework-reference/html/ejb.html,這是你如何做到這一點,不是一個很好的方式,因爲使用JNDI,但它是一個解決方案...
相關問題