【问题标题】:Strange JPA behaviour: tables cleaned at app boot奇怪的 JPA 行为:在应用程序启动时清理表
【发布时间】:2011-06-27 11:30:36
【问题描述】:

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

我正在使用已经存在的数据库结构,通过 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:由于我是法国人,我可能会误用或拼错一些单词。随时要求我重新制定。

【问题讨论】:

  • 我在 Toplink 方面没有任何经验,但是当使用 Hibernate 作为 JPA 提供者时,可以告诉 Hibernate 在每次启动时重新创建整个数据库模式。这里不是类似的吗?
  • @GrzegorzOledski :有人已经告诉我这种可能性,但我不知道 TopLink 是否实现了类似的功能。如果我找到关于 entityManager 语句的一个很好的常见问题解答,我将能够清除这一点,并可能解决问题。仍然需要好的常见问题解答,想...

标签: java jpa persistence entitymanager toplink


【解决方案1】:

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

看, http://wiki.eclipse.org/EclipseLink/Examples/JPA/DDL

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

【讨论】:

  • 我没有使用 Glassfish,因为我不打算使用 JEE 架构。它将具有桌面应用程序的形式,所有代码在客户端计算机上执行,并链接到 mysql 服务器(如第一篇文章所述)。
  • 构建的项目运行良好。 Netbeans 也确实有这种愚蠢的默认行为......太糟糕了,它没有在任何地方解释。 =)
【解决方案2】:

所以,问题是:尽管有 persistence.xml 设置,但 Netbeans 的默认行为是自动“删除并创建”策略。

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

【讨论】:

  • 感谢您报告您的发现。更多的人应该这样做!
【解决方案3】:

您的 persistence.xml 错过了一些属性定义...您必须向实体管理器指定行为方式,它将 drop 和 create 参数作为默认设置。这就是为什么在加载应用程序时删除所有行的原因。尝试添加此行以更改 jpa 行为:

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

【讨论】:

  • 我的 persistence.xml 没有错过这一行。我需要它使用默认的开发模式行为,这很好。但是默认的开发模式行为是“drop-and-create”,而开发模式是“do-nothing”。正如here所说,只是构建项目并使用构建解决了问题......顺便说一句,你不应该试图在已经回答的问题上磨砺代表...... kthxbye。
猜你喜欢
  • 1970-01-01
  • 2012-08-14
  • 1970-01-01
  • 2010-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多