hibernate:根据实体类自动创build/更新数据库表
我有以下实体类(在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根据实体类自动创build和/或更新表。 我将如何做到这一点?
我不知道离开hibernate
离开前面是否hibernate
。
参考build议它应该是hibernate.hbm2ddl.auto
create
的值将在sessionFactory create
时创build你的表,并保留它们的完整性。
create-drop
值将创build您的表,然后在closuressessionFactory时将其删除。
也许你应该明确设置javax.persistence.Table
注解?
希望这可以帮助。
您可以尝试在您的persistence.xml中更改这一行
<property name="hbm2ddl.auto" value="create"/>
至:
<property name="hibernate.hbm2ddl.auto" value="update"/>
这应该使模式保持每次运行应用程序时对模型所做的任何更改。
从JavaRanch得到这个
有时取决于如何设置configuration,属性标签的长格式和短格式也可以有所不同。
例如,如果你有这样的:
<property name="hibernate.hbm2ddl.auto" value="create"/>
尝试将其更改为:
<property name="hibernate.hbm2ddl.auto">create</property>
有一个非常重要的细节,可以阻止你的hibernate生成表(假设你已经设置了hibernate.hbm2ddl.auto
)。 你还需要@Table
注解!
@Entity @Table(name = "test_entity") public class TestEntity { }
在我的情况下已经帮了至less3次 – 还记不得了)
PS。 阅读hibernate文档 – 在大多数情况下,您可能不希望将hibernate.hbm2ddl.auto
设置为create-drop
,因为它会在停止应用程序之后删除您的表格。
在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>
Hibernate hbm2ddl.auto :
在创buildSessionFactory时自动validation或将模式DDL导出到数据库。 使用create-drop,当SessionFactory被显式closures时,数据库模式将被删除。 例如validation| 更新| 创build| 创build降
请检查链接了解更多详情。