Hibernate : 엔티티 클래스를 기반으로 db 테이블 자동 생성 / 업데이트


101

다음 엔터티 클래스 (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가 엔티티 클래스를 기반으로 테이블을 자동으로 생성 및 / 또는 업데이트하기를 바랍니다. 어떻게해야합니까?

답변:


104

hibernate앞을 떠나는 것이 효과가 있는지 모르겠습니다 .

참조는 그것이 있어야 제안hibernate.hbm2ddl.auto

값은 createsessionFactory 생성시 테이블을 생성하고 그대로 둡니다.

값은 create-drop테이블을 만든 다음 sessionFactory를 닫을 때 삭제합니다.

javax.persistence.Table주석을 명시 적으로 설정해야 할까요?

도움이 되었기를 바랍니다.


12
hbm2dll.auto의 시작 부분에서 누락 된 'hibernate'였습니다. 감사!
Jason Miesionczek

방금 그 줄을 제거했는데 테이블이 떨어지지 않습니다. 도움이 되었기를 바랍니다!
Meinkraft

1
테이블이 존재하지 않는 경우에만 최대 절전 모드로 만들 수 있습니까?
Aman Nagarkoti 2017

81

persistence.xml에서이 줄을

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

에:

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

이것은 앱을 실행할 때마다 모델에 대한 변경 사항을 따르도록 스키마를 유지하기위한 것입니다.

JavaRanch 에서 가져 왔습니다.


10

때로는 구성 설정 방법에 따라 속성 태그의 긴 형식과 짧은 형식도 차이를 만들 수 있습니다.

예를 들어 다음과 같은 경우 :

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

다음으로 변경하십시오.

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

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>

Wildfly의 인 메모리 H2 데이터베이스 사용


2

테이블 생성에서 최대 절전 모드를 중지 할 수있는 매우 중요한 세부 정보가 있습니다 (이미를 설정했다고 가정 hibernate.hbm2ddl.auto). @Table주석 도 필요합니다 !

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

그것은 이미 제 경우에 적어도 3 번 도움이되었습니다-여전히 그것을 기억할 수 없습니다.)

추신. 최대 절전 모드 문서를 읽기 - 대부분의 경우에 당신은 아마 설정하지 않습니다 hibernate.hbm2ddl.autocreate-drop이 응용 프로그램을 중지 한 후 테이블을 삭제하기 때문에.


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>

0

@thorinkor의 답변을 지원하기 위해 엔터티에 @Table (name = "table_name") 주석을 사용할뿐만 아니라 엔터티 클래스의 모든 자식 변수에도 @Column (name = "col_name") 주석을 달아야합니다. 따라서 이동 중에도 테이블을 원활하게 업데이트 할 수 있습니다.

Java 클래스 기반 hibernate 구성을 찾는 사람들을 위해 규칙은 Java 기반 구성에도 적용됩니다 (NewHibernateUtil). 다른 사람에게 도움이되기를 바랍니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.