我有一个java项目。我使用@Entity。在我的项目中有一些限制。表应该是自动创建的。所以我使用 JPa @Entity。问题是,当程序重新启动时,新表是由实体创建的。所以我的旧数据丢失了。我需要那些类型的数据。陷阱实体不应覆盖我在数据库中的内容?如何解决?
2 回答
在 persistence.xml 文件中应该有一个设置来关闭 DLL 的自动生成。这是一个使用 hibernate 的 persistence.xml 文件的示例,其中hibernate.hbm2ddl.auto
属性已设置为 validate,这将导致表不会被覆盖。如果您依赖 Hibernate 创建 DDL,您不希望在第一次运行应用程序时设置此设置,它将在运行一次并成功创建 DDL(表)后设置。
如果将此设置设置为create-drop
架构,则每次创建持久性上下文时都会重新创建表,从而导致所有数据丢失。此属性将特定于您的 ORM 供应商的实现。
最好的建议是查找供应商特定设置的文档,然后选择最适合您需求的选项。这篇文章很好地描述了 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"/>
<property name="hibernate.hbm2ddl.auto" value="update"/>
在您的 persistence.xml 中使用。如果您还没有生成架构,那么首先使用<property name="hibernate.hbm2ddl.auto" value="create"/>
并且将生成架构。然后使用<property name="hibernate.hbm2ddl.auto" value="update"/>
,因为现在你有了架构。