gpt4 book ai didi

java - JPA 实体管理器工厂注入(inject)失败(JPA 2、Eclipselink、J2EE 6)

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:03:37 26 4
gpt4 key购买 nike

我正在尝试启动并运行一个小型示例 Web 应用程序,但我在注入(inject) Entity Manager Factory 时遇到了问题。

我的persistence.xml如下;

<persistence version="2.0" xmlns=" http://java.sun.com/xml/ns/persistene"
xmlns:xsi=" http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence ttp://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
<persistence-unit name="main" transaction-type="JTA">
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
<jta-data-source>jdbc/Maindb</jta-data-source>
<properties>
<property name="eclipselink.ddl-generation" value="drop-and-create-tables" />
<property name="eclipselink.ddl-generation.output-mode" value="database" />
</properties>
</persistence-unit>

Web 应用程序有两个功能;返回客户和项目列表。

CustomerResource 对象注入(inject)实体管理器工厂如下:

@PersistenceUnit(unitName="main")
private EntityManagerFactory emf;

并通过以下代码查询持久层;

EntityManager em = emf.createEntityManager();
Customer customer = (Customer) em.find(Customer.class, customerID);

这没有问题(据我所知),我得到了预期的返回数据。

ItemResource 对象对相同的持久性单元执行相同的操作。

@PersistenceUnit(unitName="main")
private EntityManagerFactory emf;

但是注入(inject)失败,emf一直为null。

EntityManager em = emf.createEntityManager(); <- emf is null here

我不确定我在这里做错了什么,我的猜测是我错误地使用了实体管理器工厂。

任何帮助将不胜感激!谢谢

更新

我把麻烦的代码拿出来放到war文件里给大家看,有助于我隔离问题。

问题似乎与我使用的 url 模式有关。

网络.xml

<?xml version="1.0" encoding="UTF-8"?><web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
id="WebApp_ID" version="2.5">
<listener>
<listener-class>com.sun.xml.ws.transport.http.servlet.WSServletContextListener</listener-class>
</listener>
<servlet>
<servlet-name>Item</servlet-name>
<servlet-class>com.sun.xml.ws.transport.http.servlet.WSServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Item</servlet-name>
<url-pattern>/Item/*</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>Customer</servlet-name>
<servlet-class>com.sun.xml.ws.transport.http.servlet.WSServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Customer</servlet-name>
<url-pattern>/Customer</url-pattern>
</servlet-mapping>
</web-app>

太阳-jaxws.xml:

<?xml version="1.0" encoding="UTF-8"?>
<endpoints xmlns="http://java.sun.com/xml/ns/jax-ws/ri/runtime" version="2.0">
<endpoint name="Item" implementation="com.test.item.ItemResource" url-pattern="/Item/*" />
<endpoint name="Customer" implementation="com.test.customer.CustomerResource" url-pattern="/Customer" />
</endpoints>

item资源现在有两个web方法;

  1. 获取项目详细信息
    类型:获取
    路径:/
    Web 参数:项目 ID

  2. 获取项目列表
    类型:获取
    路径:/列表
    Web 参数:项目颜色

使用 url 模式中的通配符,实体管理器始终为 null。如果我删除通配符,那么我可以成功请求一个项目,但我无法请求一个项目列表,因为它没有映射。

客户资源请求总是成功的,因为它在映射中不包含任何通配符。

谢谢

最佳答案

我不确定这是否会回答问题(为什么在第二种情况下 EMF null?)但是由于您使用的是应用程序管理的实体管理器,您是否关闭了 EntityManager 正确吗?像这样:

public class LoginServlet extends HttpServlet {
@PersistenceUnit(unitName="EmployeeService")
EntityManagerFactory emf;

protected void doPost(HttpServletRequest request, HttpServletResponse response) {
String userId = request.getParameter("user");
// check valid user
EntityManager em = emf.createEntityManager();
try {
User user = em.find(User.class, userId);
if (user == null) {
// return error page
// ...
}
} finally {
em.close();
}
}

但是,老实说,我真的很奇怪您为什么不使用容器管理的实体管理器。让容器管理它的生命周期在我看来要简单得多。要注入(inject)一个 EntityManager:

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

关于java - JPA 实体管理器工厂注入(inject)失败(JPA 2、Eclipselink、J2EE 6),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3247618/

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