Hibernate:基于实体类自动创建/更新db表

Jas*_*zek 95 java mysql groovy hibernate jpa

我有以下实体类(在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

}
Run Code Online (Sandbox Code Playgroud)

和我的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>
Run Code Online (Sandbox Code Playgroud)

和脚本:

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()
Run Code Online (Sandbox Code Playgroud)

数据库Icarus存在,但目前没有表.我希望Hibernate基于实体类自动创建和/或更新表.我怎么做到这一点?

too*_*kit 98

我不知道离开hibernate前面是否有所作为.

参考表明,它应该是hibernate.hbm2ddl.auto

create将在sessionFactory创建时创建表,并保持原样不变.

create-drop将创建表,然后在关闭sessionFactory时删除它们.

也许您应该javax.persistence.Table明确设置注释?

希望这可以帮助.

  • 这是hbm2dll.auto开头缺少的'hibernate'.谢谢! (11认同)

bil*_*dev 76

您可以尝试在persistence.xml中更改此行

<property name="hbm2ddl.auto" value="create"/>
Run Code Online (Sandbox Code Playgroud)

至:

<property name="hibernate.hbm2ddl.auto" value="update"/>
Run Code Online (Sandbox Code Playgroud)

这应该保持架构以遵循每次运行应用程序时对模型所做的任何更改.

JavaRanch得到了这个


Har*_*bir 10

有时,取决于配置的设置方式,属性标签的长格式和短格式也会产生差异.

例如,如果你喜欢它:

<property name="hibernate.hbm2ddl.auto" value="create"/>
Run Code Online (Sandbox Code Playgroud)

尝试将其更改为:

<property name="hibernate.hbm2ddl.auto">create</property>
Run Code Online (Sandbox Code Playgroud)


Dev*_*Dio 6

在我的情况下,表不是第一次在没有下面列出的最后一个属性的情况下创建的:

<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>
Run Code Online (Sandbox Code Playgroud)

使用 Wildfly 的内存 H2 数据库