Я ударил головой о стену в течение последних нескольких дней, пытаясь заставить это работать, но я не смог.Весенний эквивалент @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 не вводится вообще, и я не уверен, что случилось.
Так два вопроса в основном:
- Как можно впрыскивать EntityManager с помощью 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();
...
}
Спасибо!
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>
В основном вы спрашиваете, как настроить весну, s o что он вводит несколько PersistenceContexts. Google для «двух главных менеджеров сущностей». –
Спасибо, но есть вещи, которые не имеют смысла. Должен ли быть какой-то файл context.xml, описывающий бобы? Я использую Hibernate с JPA2 и имею файл persistence.xml, где определяется источник данных, поэтому я бы хотел, чтобы этого было достаточно? –
Этот материал довольно простой. Взгляните на весенние документы. – atamanroman