我创建了一个" Java EE Web模块" IntelliJ中的项目。然后我编写了一个接受JSON输入的JaxRS注释类。然后,我使用数据填充带注释的实体,并尝试使用托管持久性上下文来持久化它。
@Stateless
@Path("/states")
public class StateController {
@PersistenceContext(unitName = "testunit")
private EntityManager em;
@POST
@Path("/session_new")
@Produces({ MediaType.APPLICATION_JSON })
@Consumes({ MediaType.APPLICATION_JSON })
public Response session_new(final CustomerSessionRequest req) {
CustomerSessions cs = new CustomerSessions(req.session_data);
em.persist(cs);
em.flush();
System.out.println("New CustomerSession saved: " + cs.getCustomerSessionId());
return Response.ok(cs).build();
}
}
我在IntelliJ中配置了一个名为" testdb"的数据源,以及一个名为" testunit"的持久性单元。在持久性工具窗口中映射到该数据源。
我的持久性XML看起来像这样:
<persistence-unit name="testunit">
<jta-data-source>testdb</jta-data-source>
<class>datamodels.testdb.CustomerSessions</class>
<properties>
<property name="openjpa.ConnectionURL" value="jdbc:mysql://localhost:3306/testdb"/>
<property name="openjpa.ConnectionDriverName" value="com.mysql.jdbc.Driver"/>
<property name="openjpa.ConnectionUserName" value="testuser"/>
<property name="openjpa.ConnectionPassword" value="testpassword"/>
<property name="openjpa.Log" value="DefaultLevel=WARN, Runtime=INFO, Tool=INFO, SQL=TRACE"/>
<property name="openjpa.jdbc.SynchronizeMappings" value="buildSchema" />
</properties>
</persistence-unit>
</persistence>
一切都建立和部署得很好,没有任何警告。请求也运行得很好,并返回预期的响应,并生成新的客户会话ID。
但是,数据库中没有任何内容。
所以,我的问题是:数据在哪里,以及如何使持久化和刷新调用对我的数据库起作用?
编辑: 我已经尝试了几件事。
1)看起来TomEE正在使用某种内存中的HSQL数据库,其数据源名称为&#34;默认JDBC数据源&#34;。 2)当我手动创建实体管理器工厂,然后是实体管理器时,一切正常:
EntityManagerFactory emf = Persistence.createEntityManagerFactory("testunit");
EntityManager em = emf.createEntityManager();
try {
em.getTransaction().begin();
CustomerSessions cs = new CustomerSessions(req.session_data);
em.persist(cs);
em.flush();
em.getTransaction().commit();
System.out.println("New CustomerSession saved: " + cs.getCustomerSessionId());
return Response.ok(cs).build();
} catch (Exception ex) {
em.getTransaction().rollback();
return Response.serverError().entity("An exception occurred").build();
}
2)如果我尝试使用EntityManagerFactory
注释创建@PersistenceUnit
,则会出现同样的初始问题。
答案 0 :(得分:1)
我遗失了两件事:
<Resource>
个对象(我没有
我希望,因为我希望它与应用程序一起部署)。我发现了
这可以在resources.xml
或WEB-INF
中的META-INF
文件中完成
{{1}}个目录。我仍然没有解释为什么应用程序管理(手动创建)的持久性上下文首先起作用,但至少现在我让它一致地工作。