我有以下实体类(在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基于实体类自动创建和/或更新表 . 我怎么做到这一点?
7 回答
我不知道离开前面的
hibernate
是否有所作为 .reference表明它应该是
hibernate.hbm2ddl.auto
值
create
将在创建sessionFactory时创建表,并保持原样不变 .值
create-drop
将创建表,然后在关闭sessionFactory时删除它们 .也许你应该明确地设置javax.persistence.Table注释?
希望这可以帮助 .
您可以尝试在persistence.xml中更改此行
至:
这应该保持架构以遵循每次运行应用程序时对模型所做的任何更改 .
来自JavaRanch
有时,取决于配置的设置方式,属性标签的长格式和短格式也会产生差异 .
例如如果你喜欢它:
尝试将其更改为:
在我的情况下,表没有首次创建,没有下面列出的最后一个属性:
使用Wildfly的内存H2数据库
有一个非常重要的细节,可能会阻止你的休眠生成表(假设你已经设置了
hibernate.hbm2ddl.auto
) . 您还需要@Table
注释!它已经在我的案例中至少帮助了3次 - 仍然记不清楚;)
PS . 阅读hibernate文档 - 在大多数情况下,您可能不希望将
hibernate.hbm2ddl.auto
设置为create-drop
,因为它会在停止应用程序后删除您的表 .在applicationContext.xml文件中:
Hibernate hbm2ddl.auto :
创建SessionFactory时,自动验证或将架构DDL导出到数据库 . 使用create-drop,当SessionFactory显式关闭时,将删除数据库模式 . 例如验证|更新|创建|创建降
请查看link了解更多详情 .