我有以下实体类(在Groovy中):
import javax.persistence.Entity
import javax.persistence.Id
import javax.persistence.GeneratedValue
import javax.persistence.GenerationType
@Entity
public class ServerNode {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
Long id
String firstName
String lastName
}
和我的persistence.xml:
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="1.0">
<persistence-unit name="NewPersistenceUnit">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<properties>
<property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/Icarus"/>
<property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/>
<property name="hibernate.connection.username" value="root"/>
<property name="hibernate.connection.password" value=""/>
<property name="hibernate.archive.autodetection" value="class"/>
<property name="hibernate.show_sql" value="true"/>
<property name="hibernate.format_sql" value="true"/>
<property name="hbm2ddl.auto" value="create"/>
</properties>
<class>net.interaxia.icarus.data.models.ServerNode</class>
</persistence-unit>
</persistence>
和脚本:
import javax.persistence.EntityManager
import javax.persistence.EntityManagerFactory
import javax.persistence.Persistence
import net.interaxia.icarus.data.models.ServerNode
def factory = Persistence.createEntityManagerFactory("NewPersistenceUnit")
def manager = factory.createEntityManager()
manager.getTransaction().begin()
manager.persist new ServerNode(firstName: "Test", lastName: "Server")
manager.getTransaction().commit()
数据库 Icarus 存在,但目前没有表格。我希望Hibernate基于实体类自动创建和/或更新表。我该如何做到这一点?
答案 0 :(得分:97)
我不知道离开前方hibernate
是否有所作为。
reference表明它应该是hibernate.hbm2ddl.auto
值create
将在创建sessionFactory时创建表,并保持原样。
值create-drop
将创建表,然后在关闭sessionFactory时删除它们。
也许您应该明确设置javax.persistence.Table
注释?
希望这有帮助。
答案 1 :(得分:75)
您可以尝试从
更改persistence.xml中的这一行<property name="hbm2ddl.auto" value="create"/>
为:
<property name="hibernate.hbm2ddl.auto" value="update"/>
这应该保持架构遵循每次运行应用程序时对模型所做的任何更改。
答案 2 :(得分:10)
有时,根据配置的设置方式,属性标签的长格式和短格式也会产生差异。
e.g。如果你喜欢它:
<property name="hibernate.hbm2ddl.auto" value="create"/>
尝试将其更改为:
<property name="hibernate.hbm2ddl.auto">create</property>
答案 3 :(得分:1)
在我的情况下,第一次没有创建表而没有下面列出的最后一个属性:
<properties>
<property name="hibernate.archive.autodetection" value="class"/>
<property name="hibernate.show_sql" value="true"/>
<property name="hibernate.format_sql" value="true"/>
<property name="hbm2ddl.auto" value="create-drop"/>
<!-- without below table was not created -->
<property name="javax.persistence.schema-generation.database.action" value="drop-and-create" />
</properties>
使用Wildfly的内存H2数据库
答案 4 :(得分:0)
有一个非常重要的细节,可能会阻止你的休眠生成表(假设你已经设置了// Static Globals
public static final String TEMP_IMAGE = "temp_image";
public static final String OUTPUT_FORMAT = "outputFormat";
public static final String IMAGE_FOLDER = "/these_pictures"; // don't forget the / at the beginning.
public static final int REQUEST_IMAGE_CAPTURE = 12; // just internal use.
public static final String IMAGE_TYPE = ".jpg";
)。您还需要hibernate.hbm2ddl.auto
注释!
@Table
它已经在我的案例中帮助了至少3次 - 仍然记不起来了;)
PS。阅读hibernate文档 - 在大多数情况下,您可能不希望将@Entity
@Table(name = "test_entity")
public class TestEntity {
}
设置为hibernate.hbm2ddl.auto
,因为它会在停止应用程序后删除您的表。
答案 5 :(得分:0)
在applicationContext.xml文件中:
<bean id="entityManagerFactoryBean" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="dataSource" />
<!-- This makes /META-INF/persistence.xml is no longer necessary -->
<property name="packagesToScan" value="com.howtodoinjava.demo.model" />
<!-- JpaVendorAdapter implementation for Hibernate EntityManager.
Exposes Hibernate's persistence provider and EntityManager extension interface -->
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" />
</property>
<property name="jpaProperties">
<props>
<prop key="hibernate.hbm2ddl.auto">update</prop>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop>
</props>
</property>
</bean>
答案 6 :(得分:0)
为了支持@thorinkor的答案,我将扩展答案以不仅为实体使用@Table(name =“ table_name”)注释,而且实体类的每个子变量都应使用@Column(name =“ col_name ”)。这样就可以随时随地无缝更新表。
对于那些正在寻找基于Java类的休眠配置的人,该规则也适用于基于Java的配置(NewHibernateUtil)。希望对别人有帮助。
答案 7 :(得分:-5)
Hibernate hbm2ddl.auto :
创建SessionFactory时,自动验证或将架构DDL导出到数据库。使用create-drop,当SessionFactory显式关闭时,将删除数据库模式。 例如验证|更新|创建|创建降
请查看link了解详情。