【问题标题】:How to overwrite the table in JPA or Entity?如何覆盖 JPA 或实体中的表?
【发布时间】:2013-08-02 03:41:52
【问题描述】:

我有一个 java 项目。我使用@Entity。在我的项目中有一些限制。表应该是自动创建的。所以我使用 JPa @Entity。问题是,当程序重新启动时,新表是由实体创建的。所以我的旧数据丢失了。我需要那些类型的数据。陷阱实体不应覆盖我在数据库中的内容?如何解决?

【问题讨论】:

  • 您使用的是什么 ORM?休眠?
  • 您已经配置了一个“删除并创建表”DDL 选项,与您使用的任何提供程序一起使用,而不仅仅是创建表选项。检查您的提供商设置和文档以了解如何更改它

标签: java jpa entity


【解决方案1】:

在您的 persistence.xml 中使用 <property name="hibernate.hbm2ddl.auto" value="update"/>。如果您还没有生成架构,那么首先使用<property name="hibernate.hbm2ddl.auto" value="create"/> 并且将生成架构。然后使用<property name="hibernate.hbm2ddl.auto" value="update"/>,因为现在你有了架构。

【讨论】:

    【解决方案2】:

    persistence.xml 文件中应该有一个设置来关闭 DLL 的自动生成。这是一个使用 hibernate 的 persistence.xml 文件的示例,其中 hibernate.hbm2ddl.auto 属性已设置为 validate,这将导致表不会被覆盖。如果您依赖 Hibernate 创建 DDL,您不希望在第一次运行应用程序时设置此设置,它将在运行一次并成功创建 DDL(表)后设置。

    如果将此设置设置为create-drop,则架构将在每次创建持久性上下文时重新创建表,从而导致所有数据丢失。此属性将特定于您的 ORM 供应商的实现。

    最好的建议是查找供应商特定设置的文档,然后选择最适合您需求的选项。 post 很好地描述了 Hibernate 中设置的可能值。

    <persistence-unit name="toThought" transaction-type="RESOURCE_LOCAL">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <properties>
          <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect" />
          <property name="hibernate.show_sql" value="true"/>
          <property name="hibernate.format_sql" value="true"/>  
          <property name="hibernate.hbm2ddl.auto" value="validate"/>        
        </properties>
    </persistence-unit>
    

    在 EclipseLink 中,这个属性是:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-11
      • 2013-06-05
      • 1970-01-01
      相关资源
      最近更新 更多