0

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

谢谢你的时间 :)

4

1 回答 1

0

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

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

于 2012-05-28T14:49:58.123 回答