TomEE + OpenJPA + IntelliJ实体不会持久存在

时间:2014-01-27 00:27:36

标签: java jpa intellij-idea tomee

我创建了一个" 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,则会出现同样的初始问题。

1 个答案:

答案 0 :(得分:1)

我遗失了两件事:

  1. 我没有在tomee.xml中指定<Resource>个对象(我没有 我希望,因为我希望它与应用程序一起部署)。我发现了 这可以在resources.xmlWEB-INF中的META-INF文件中完成 {{1}}个目录。
  2. 我没有MySQL驱动程序jar TomEE lib目录。不幸的是,TomEE透明地加载 而是默认的JDBC驱动程序,导致实体在其中保留 拥有神奇的数据库。
  3. 我仍然没有解释为什么应用程序管理(手动创建)的持久性上下文首先起作用,但至少现在我让它一致地工作。