我在 IntelliJ 中创建了一个“Java EE Web Module”项目。然后我编写了一个接受 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>
一切都构建和部署得很好,没有任何警告。该请求也运行得很好,并返回预期的响应,并生成了新的客户 session ID。
但是,数据库中什么也没有出现。
所以,我的问题是:数据去哪里了,如何使持久和刷新调用对我的数据库起作用?
编辑: 我还尝试了其他一些方法。
1) TomEE 似乎正在使用某种内存中的 HSQL 数据库,其数据源名称为“默认 JDBC 数据源”。 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) 如果我尝试使用 @PersistenceUnit
注释创建 EntityManagerFactory
,则会出现相同的初始问题。
最佳答案
我缺少两件事:
- 我没有指定
<Resource>
tomee.xml 中的对象(我没有 想要,因为我希望它与应用程序一起部署)。我发现 这可以在resources.xml
中完成文件在WEB-INF
或者META-INF
目录。 - 我的目录中没有 MySQL 驱动程序 jar TomEE lib 目录。不幸的是 TomEE 正在透明加载 相反,默认 JDBC 驱动程序,导致实体持久保留在其 自己的神奇数据库。
我仍然无法解释为什么应用程序管理的(手动创建的)持久性上下文首先起作用,但至少现在我让它一致地工作。
关于java - TomEE + OpenJPA + IntelliJ 实体不持久,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21371192/