Moh*_*mir 3 spring jpa jakarta-ee
在过去的几天里,我一直在用头撞墙,试图让它发挥作用,但我没能做到。
我最近使用 EJB 写了一个 JPA EntityManagerProvider:
EntityManagerProviderBean.java
@Stateless
public class EntityManagerProviderBean {
@PersistenceContext(unitName="PU1")
private EntityManager entityManager1;
@PersistenceContext(unitName="PU2")
private EntityManager entityManager2;
public EntityManager getEntityManager() {
return (...) ? entityManager1: entityManager2;
}
}
Run Code Online (Sandbox Code Playgroud)
然后当然我可以像这样在任何需要的地方注入 EJB:
用户界面
@Stateless
public class UserFacade {
@EJB
private EntityManagerProviderBean emProvider;
private EntityManager em = emProvider.getEntityManager();
...
}
Run Code Online (Sandbox Code Playgroud)
现在我正在尝试使用 Spring 来做一些类似的事情,使用注释,而不是在 XML 中做任何事情。我似乎无法找到注入 EntityManager 的方法。我所做的任何事情都会导致 NullPointerException。例如,我尝试在不依赖于我的 EntityManagerProviderBean 的情况下手动注入 EntityManager,如下所示:
UserFacadeSpring.java
public class UserFacadeSpring {
@PersistenceContext(unitName="PU1")
private EntityManager em;
...
}
Run Code Online (Sandbox Code Playgroud)
但这给了我一个 NullPointerException。所以 EntityManager 根本没有被注入,我不确定出了什么问题。
所以基本上有两个问题:
在这方面的任何帮助将不胜感激。正如你所知道的,我对 Spring 完全是个菜鸟。我试图阅读指南,但此刻一切都在我的脑海中飞扬。我实际上确实尝试做一些半生不熟的事情,但它也不起作用(我要么得到 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;
}
}
Run Code Online (Sandbox Code Playgroud)
主程序
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();
...
}
Run Code Online (Sandbox Code Playgroud)
谢谢!
编辑:我将 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>
Run Code Online (Sandbox Code Playgroud)
要在依赖注入级别具有完全相同的功能,不可能将无状态 ejb bean 映射到 spring bean。
EJB @Singleton -> Spring @Component(或@Service 或@Controller 或@Repository)
EJB @Stateful -> Spring @Component@Scope("prototype") (或@Service@Scope("prototype") 或@Controller@Scope("prototype") 或@Repository@Scope("prototype"))
EJB @Stateless -> 春季不存在。
无状态 bean 对于这种多持久性上下文非常方便……但是,由于 Spring 不提供无状态 bean。您必须使用自定义 Spring 设置来应用多个持久性上下文。不幸的是,它不能像 EJB 那样只使用persistence.xml :(。
所以回答你的问题:
@EnableTransactionManagement为每个持久化上下文使用一个事务管理器和一个实体管理器工厂。jndi,但它是一个解决方案......| 归档时间: |
|
| 查看次数: |
5553 次 |
| 最近记录: |