关于Java EE persistence.xml属性的混淆

时间:2012-05-27 01:30:26

标签: eclipse java-ee eclipselink persistence.xml

在Java EE中,当使用JPA来持久化类时,我的persistance.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方法将一些值硬编码到used中。为此,该示例使用:

<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将尝试DROP所有表,然后创建所有表。如果遇到任何问题,EclipseLink将遵循特定数据库和JDBC驱动程序组合的默认行为,然后继续下一个语句。 (另请参阅eclipselink.create-ddl-jdbc-file-name和eclipselink.drop-ddl-jdbc-file-name。)

如果我使用none属性,它是否会使用填充数据获取现有表?或者根本不会没有表格而没有帮助? 如果我使用create-tables,我不会抛出异常吗?因为我试图使用的表已经存在。

感谢您的时间:)

1 个答案:

答案 0 :(得分:0)

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

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