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

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



답변

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

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

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

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

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

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


답변

persistence.xml에서이 줄을

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

에:

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

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

JavaRanch 에서 가져 왔습니다.


답변

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

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

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

다음으로 변경하십시오.

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


답변

제 경우에는 아래에 나열된 마지막 속성없이 처음으로 테이블이 생성되지 않았습니다.

<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 데이터베이스 사용


답변

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

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

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

추신. 최대 절전 모드 문서를 읽기 – 대부분의 경우에 당신은 아마 설정하지 않습니다 hibernate.hbm2ddl.autocreate-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>


답변

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

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