gpt4 book ai didi

具有多个@PersistenceContext 的@Stateless EJB 的Spring 等价物

转载 作者:行者123 更新时间:2023-12-04 00:26:02 25 4
gpt4 key购买 nike

在过去的几天里,我一直在用头撞墙,试图让它工作,但我没能做到。

我最近使用 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;
}
}

当然,我可以像这样在任何需要的地方注入(inject) EJB:

UserFacade.java

@Stateless
public class UserFacade {

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

...
}

现在我正在尝试使用 Spring、使用注释来做一些类似的事情,而不用在 XML 中做任何事情。我似乎想不出注入(inject) EntityManager 的方法。我所做的任何事情都会导致 NullPointerException。例如,我尝试在不依赖我的 EntityManagerProviderBean 的情况下手动注入(inject) EntityManager,如下所示:

UserFacadeSpring.java

public class UserFacadeSpring {

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

...
}

但这给了我一个 NullPointerException。所以 EntityManager 根本没有被注入(inject),我不确定出了什么问题。

所以基本上有两个问题:

  1. 如何使用 Spring 注入(inject) EntityManager?
  2. 如何在 Spring 中使用现有的 EntityManagerProviderBean EJB?我需要进行哪些修改?

在此问题上的任何帮助将不胜感激。如您所知,我是 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;
}
}

主.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>

最佳答案

要在依赖注入(inject)级别具有完全相同的功能,将无状态 ejb bean 映射到 spring bean 是不可能的。

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

EJB @Stateful -> Spring @Component@Scope("prototype") (or @Service@Scope("prototype") or @Controller@Scope("prototype") or @Repository@Scope("prototype"))

EJB @Stateless -> DOES NOT EXIST IN SPRING.

无状态 bean 对于这种多重持久化上下文非常方便……但是,由于 Spring 不提供无状态 bean。您必须使用自定义 Spring 设置来应用多个持久性上下文。不幸的是,它不能像 EJB 那样只与 persistence.xml 一起工作:(。

所以回答你的问题:

  1. 阅读 Spring 文档...到处都有大量示例。很快,在 Spring 4 Java Config 中,您可以使用 @EnableTransactionManagement,每个持久化上下文都有一个事务管理器和一个实体管理器工厂。
  2. http://docs.spring.io/spring/docs/current/spring-framework-reference/html/ejb.html .这就是你如何做的。自从使用 jndi 以来这不是一个好方法,但它是一个解决方案...

关于具有多个@PersistenceContext 的@Stateless EJB 的Spring 等价物,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30597307/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com