Java 托米+;OpenJPA+;IntelliJ实体不';不坚持

Java 托米+;OpenJPA+;IntelliJ实体不';不坚持,java,jpa,intellij-idea,apache-tomee,Java,Jpa,Intellij Idea,Apache Tomee,我在IntelliJ中创建了一个“JavaEEWeb模块”项目。然后,我编写了一个接受JSON输入的JaxRS注释类。然后,我用数据填充带注释的实体,并尝试使用托管持久性上下文持久化它 @无国籍 @路径(“/状态”) 公共类状态控制器{ @PersistenceContext(unitName=“testunit”) 私人实体管理者; @职位 @路径(“/session\u new”) @产生({MediaType.APPLICATION_JSON}) @使用({MediaType.APPLI

我在IntelliJ中创建了一个“JavaEEWeb模块”项目。然后,我编写了一个接受JSON输入的JaxRS注释类。然后,我用数据填充带注释的实体,并尝试使用托管持久性上下文持久化它


@无国籍
@路径(“/状态”)
公共类状态控制器{
@PersistenceContext(unitName=“testunit”)
私人实体管理者;
@职位
@路径(“/session\u new”)
@产生({MediaType.APPLICATION_JSON})
@使用({MediaType.APPLICATION_JSON})
公共响应会话\u新建(最终CustomerSessionRequest请求){
CustomerSessions cs=新的CustomerSessions(请求会话数据);
em.c;
em.flush();
System.out.println(“保存的新CustomerSession:+cs.getCustomerSessionId());
返回Response.ok(cs.build();
}
}
我在IntelliJ中配置了一个名为“testdb”的数据源,以及一个名为“testunit”的持久化单元,它在持久化工具窗口中映射到该数据源

我的持久性XML如下所示:


2) 如果我尝试使用
@PersistenceUnit
注释创建
EntityManagerFactory
,同样的初始问题也会出现。

我缺少两件事:

  • 我没有在tomee.xml中指定
    对象(我没有指定) 想要,因为我希望它与应用程序一起部署)。我发现 这可以在
    WEB-INF
    中的
    resources.xml
    文件中完成,或者
    META-INF
    目录
  • 我的数据库中没有MySQL驱动程序jar 托米库目录。不幸的是,托米正在透明地加载 而是默认的JDBC驱动程序,导致实体在其 拥有神奇的数据库

  • 我仍然没有解释为什么应用程序管理(手动创建)的持久性上下文最初可以工作,但至少现在我让它一直工作。

    当您返回响应时,浏览器可以看到
    响应ok
    状态代码?您的
    事务管理器配置是否正确?我怀疑它在提交交易时失败了。@Rp-是的,我正在用Chrome中的Postman进行测试,结果返回的很好,ID字段中填充了一个新的ID。坦率地说,似乎在某个地方保存了一个我找不到的神奇的不可见数据库。因为我使用的是托管持久性上下文,所以我没有写任何关于TransactionManager的内容。如果这有帮助,当我停止服务器时,我会收到以下信息消息:“2014年1月27日上午10:02:39 org.apache.openejb.assembler.classic.assembler销毁资源信息:关闭数据源:默认JDBC数据库2014年1月27日上午10:02:39 org.apache.openejb.assembler.classic.assembler销毁资源信息:关闭数据源:默认非托管JDBC数据库J“。我希望这是我的数据源。您的类路径中是否有任何与
    h2
    hsqldb
    相关的JAR?尝试删除它们,并尝试它们是否失败以及类未找到异常。不,除非TomEE自己带来这些异常。。。
        <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>
    
        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();
        }