java - TomEE + OpenJPA + IntelliJ 实体不持久

标签 java jpa intellij-idea apache-tomee

我在 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,则会出现相同的初始问题。

最佳答案

我缺少两件事:

  1. 我没有指定<Resource> tomee.xml 中的对象(我没有 想要,因为我希望它与应用程序一起部署)。我发现 这可以在 resources.xml 中完成文件在 WEB-INF或者 META-INF目录。
  2. 我的目录中没有 MySQL 驱动程序 jar TomEE lib 目录。不幸的是 TomEE 正在透明加载 相反,默认 JDBC 驱动程序,导致实体持久保留在其 自己的神奇数据库。

我仍然无法解释为什么应用程序管理的(手动创建的)持久性上下文首先起作用,但至少现在我让它一致地工作。

关于java - TomEE + OpenJPA + IntelliJ 实体不持久,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21371192/

相关文章:

java - 我在 eclipse 项目目录中找不到我保存的文件

mysql - jpa id生成策略,@id默认是auto,mysql默认是IDENTITY,但是我发现生成了一个hibernate_sequence表,为什么?

java - 找不到 android.Activity 类 intellij IDEA

java - 如何在 IntelliJ IDEA 10.5 中删除项目?

intellij-idea - (Go) 如何在 IntelliJ IDEA 上使用 GDB 调试?

java - Java 处理链中的作业排队

java - 如何解决这个内存一致性错误?

java - 我想在 Eclipse 中编辑自动文本添加功能

java - 查询jpa数据库时,是否可以使用这样的方法?

java - 无法在带有 MySql 的 JPA 实体中使用 java.time.LocalDate