【问题标题】:confusion about Java EE's persistence.xml's property attribute关于 Java EE 的 persistence.xml 的 property 属性的混淆
【发布时间】:2012-05-27 01:30:25
【问题描述】:

在 Java EE 中,当使用 JPA 持久化类时,我的 persistence.xml 文件如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.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_2_0.xsd">
    <persistence-unit name="JMonks_Crud">
        <jta-data-source>jdbc/example</jta-data-source>
        <class>models.Class1</class>
        <class>models.Class2</class>
        <properties>
            <property name="eclipselink.ddl-generation" value="drop-and-create-tables"/>
            <property name="eclipselink.ddl-generation.output-mode" value="both"/>
        </properties>
    </persistence-unit>
</persistence>

到目前为止,我对 JPA 的唯一经验来自一个应该清除数据库中所有值的示例,然后是 servlet 的 post 方法将一些值硬编码到使用的值中。为此,示例使用:

<property name="eclipselink.ddl-generation" value="drop-and-create-tables"/>

但是我想在会话之间将数据保存在数据库中(就像任何好的动态站点一样),我不知道在 value 属性中放入什么来完成此操作。 wikia 网站 (http://wiki.eclipse.org/Using_EclipseLink_JPA_Extensions_(ELUG)#Using_EclipseLink_JPA_Extensions_for_Schema_Generation) 说,它可以在这个值中放置三个不同的值:

  • none – EclipseLink 不生成 DDL;没有生成架构。
  • create-tables – EclipseLink 将尝试为每个表执行 CREATE TABLE SQL。如果表已经存在,EclipseLink 将遵循特定数据库和 JDBC 驱动程序组合的默认行为(当为已经存在的表发出 CREATE TABLE SQL 时)。在大多数情况下,会引发异常并且不会创建表。然后 EclipseLink 将继续执行下一条语句。 (另请参见 eclipselink.create-ddl-jdbc-file-name。)
  • drop-and-create-tables – EclipseLink 将尝试删除所有表,然后创建所有表。如果遇到任何问题,EclipseLink 将遵循特定数据库和 JDBC 驱动程序组合的默认行为,然后继续执行下一条语句。 (另请参见 eclipselink.create-ddl-jdbc-file-name 和 eclipselink.drop-ddl-jdbc-file-name。)

如果我使用 none 属性,它会抓取包含填充数据的现有表吗?还是没有人根本不做桌子,也无济于事? 如果我使用创建表,我不会抛出异常吗?因为我尝试使用的表已经存在。

感谢您的宝贵时间:)

【问题讨论】:

  • 折腾了大约一个小时,问题好像自己解决了,属性还是设置为“drop-and-create-tables”,但是数据现在保存了。

标签: eclipse jakarta-ee eclipselink persistence.xml


【解决方案1】:

如果您使用 create-tables,EclipseLink 将在部署发生时创建您的实体定义的表。如果您使用 drop-and-create-tables,您可能会遇到问题,因为它会首先尝试删除每个实体的表,然后重新创建它们。如果您重新部署应用程序或重新启动应用程序,这可能会导致您丢失数据。这主要用于开发和测试,当测试每次启动时都会填充数据库。

如果使用 EclipseLink 2.4(每晚构建),您还可以使用 create-or-extend-tables,如果您在重新部署时向实体添加字段,则会在现有表上使用 alter table 语句。

【讨论】:

    猜你喜欢
    • 2012-12-17
    • 2015-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多