java Hibernate:基于实体类自动创建/更新数据库表

wxclj1h5  于 2022-12-25  发布在  Java
关注(0)|答案(8)|浏览(244)

我有以下实体类(在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 已经存在,但是目前没有表。2我希望Hibernate能够自动创建和/或更新基于实体类的表。3我该如何完成这个任务?

bkhjykvo

bkhjykvo1#

我不知道是否离开hibernate的前面有什么不同。
参考文献建议它应为hibernate.hbm2ddl.auto
create将在创建sessionFactory时创建表,并保持它们不变。
create-drop将创建表,然后在关闭sessionFactory时删除它们。
也许您应该显式地设置javax.persistence.Table注解?

wribegjk

wribegjk2#

您可以尝试将persistence.xml中的此行从

<property name="hbm2ddl.auto" value="create"/>

致:

<property name="hibernate.hbm2ddl.auto" value="update"/>

这是为了维护模式,以遵循您每次运行应用程序时对模型所做的任何更改。
JavaRanch得到这个

drnojrws

drnojrws3#

有时,根据配置的设置方式,属性标记的长格式和短格式也会造成差异。
例如,如果您有这样的问题:

<property name="hibernate.hbm2ddl.auto" value="create"/>

尝试将其更改为:

<property name="hibernate.hbm2ddl.auto">create</property>
yks3o0rb

yks3o0rb4#

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

<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数据库

nhjlsmyf

nhjlsmyf5#

有一个非常重要的细节,可能会阻止您的hib生成表(假设您已经设置了hibernate.hbm2ddl.auto)。您还需要@Table注解!

@Entity
@Table(name = "test_entity")
    public class TestEntity {
}

它已经帮助在我的情况下至少3次-仍然不记得它;)
PS.阅读休眠文档-在大多数情况下,你可能不想将hibernate.hbm2ddl.auto设置为create-drop,因为它会在停止应用程序后删除你的表。

gv8xihay

gv8xihay6#

1.自动创建表格,与注解无关
1.为此,我们需要像这样修改“hibernate.cfg.xml”。

<property name="hbm2ddl.auto">update</property>
jckbn6z7

jckbn6z77#

在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>
r6hnlfcb

r6hnlfcb8#

为了支持@thorinkor的答案,我将扩展我的答案,不仅对实体使用@Table(name =“table_name”)注解,而且实体类的每个子变量都应该使用@Column(name =“col_name”)注解,这将导致对表的无缝更新。
对于那些正在寻找基于Java类的Hibernate配置的人来说,这个规则也适用于基于Java的配置(NewHibernateUtil)。希望对其他人有所帮助。

相关问题