奇怪的JPA行为:在应用程序启动时清理表

时间:2011-02-15 09:38:32

标签: java jpa persistence entitymanager toplink

几乎所有内容都在标题中......当应用程序启动时,持久性工作正常,当应用程序关闭时行仍在数据库中,但是一旦加载了应用程序,行就被删除了......

我正在使用已经存在的数据库结构,通过mysql5 SGBD。

似乎来自我的实体经理声明。以下是我的代码的几行(实体管理器语句和persistence.xml)

entityManager声明:

entityManager = java.beans.Beans.isDesignTime() ? null : javax.persistence.Persistence.createEntityManagerFactory(resourceMap.getString("entityManager.persistenceUnit")).createEntityManager();
query = java.beans.Beans.isDesignTime() ? null : entityManager.createQuery(resourceMap.getString("query.query"));

的persistence.xml:


    <?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
  <persistence-unit name="AnalysesPU" transaction-type="RESOURCE_LOCAL">
    <provider>oracle.toplink.essentials.PersistenceProvider
    <class>solianceanalysesmanager.Produits
    <properties>
      <property name="toplink.jdbc.user" value="XXX"/>
      <property name="toplink.jdbc.password" value="X"/>
      <property name="toplink.jdbc.url" value="jdbc:mysql://localhost:3306/Analyses"/>
      <property name="toplink.jdbc.driver" value="com.mysql.jdbc.Driver"/>
    </properties>
  </persistence-unit>
</persistence>

有人知道这个奇怪的问题吗? 我已经建议我的entityManager在其声明中重新初始化持久化上下文...

PS:因为我是法国人,所以我可能会误用或拼写错误的单词。随意请我重新制定。

3 个答案:

答案 0 :(得分:2)

默认情况下,TopLink Essentials不会重新创建表,但可以在persistence.xml中对其进行配置。

请参阅, http://wiki.eclipse.org/EclipseLink/Examples/JPA/DDL

我的猜测是你在使用Glassfish?我相信Glassfish默认在开发模式下执行此操作,并且您需要配置一些Glassfish设置以避免这种情况。我不确定它是如何在Glassfish中配置的,也许是别人做的。

答案 1 :(得分:2)

所以,问题是:尽管有persistence.xml设置,Netbeans默认行为是一种自动的“drop and create”策略。

构建项目后,使用.jar将不会重置数据库表。

答案 2 :(得分:1)

你的persistence.xml错过了一些属性定义...你必须指定实体管理器如何表现,它将丢弃并创建参数作为默认设置。这就是加载应用程序时删除所有行的原因。尝试添加此行以更改jpa行为:

<property name="toplink.ddl-generation" value="create-tables"/>