테이블자동생성 Ant Script

written by on June 17th, 2008 @ 06:46 AM

Hibernate 테이블 자동생성 Ant Script

  • 아래 과정과 상관없이, hibernate.hbm2ddl.auto 프라퍼티를 true로 지정하면, 스키마가 바뀌고, Hibernate 설정이 다시 로딩 될 때 마다 스키마를 재구성해준다. 테스트 환경에서는 이 속성을 사용하는 것이 편하다.
  • Hibernate 단독 사용시, 테이블을 자동으로 생성해주는 Hibernate Java Code는 다음과 같다.
  1. package testutils;

  2. import org.hibernate.cfg.Configuration;

  3. import org.hibernate.tool.hbm2ddl.SchemaExport;

  4. public class HibernateTableSchemaCreation {

  5.     public static void main(String[] args) {

  6.         Configuration cfg = new Configuration().configure("hibernate.cfg.xml");

  7.         SchemaExport schemaExport = new SchemaExport(cfg);

  8. schemaExport.create(true, true);

  9.         System.out.println("테이블 스키마를 리셋하였습니다.");

  10.     }

  11. }

  • Spring 2.0에 연동해서 사용할 때는 hibernate.cfg.xml 파일이 없기 때문에 다음과 같이 Spring에서 제공해주는 기능을 이용한다. LocalSessionFactoryBean의 id가 "sessionFactory"로 지정돼 있을 때를 가정했다. 아래와 같이 Bean을 얻어올 때 앞에 & 기호가 있어야만 LocalSessionFactoryBean의 객체를 가져올 수 있다.
  1. package testutils;

  2. import org.springframework.context.ApplicationContext;

  3. import org.springframework.context.support.FileSystemXmlApplicationContext;

  4. import org.springframework.orm.hibernate3.LocalSessionFactoryBean;

  5. public class HibernateTableSchemaCreation {

  6.     public static void main(String[] args) {

  7.  

  8.         String [] paths = { "WebContent/WEB-INF/applicationContext-*.xml" };

  9.         ApplicationContext ctx = new FileSystemXmlApplicationContext(paths);

  10.         LocalSessionFactoryBean lsfb = (LocalSessionFactoryBean)ctx.getBean("&sessionFactory");

  11.         lsfb.dropDatabaseSchema();
            lsfb.createDatabaseSchema();

  12.         System.out.println("테이블 스키마를 리셋하였습니다.");

  13.     }

  14. }

 

위 클래스를 Ant에 등록해서 사용할 수 있다.

  1.     <target name="reset-schema">
            <input
                message="DB데이터가 모두 초기화 됩니다. 수행하시겠습니까? (yes/no)"
                addproperty="do.proceed"/>

            <fail message="취소하셨습니다."> <!-- yes 가 아닐경우 취소 -->
                <condition>
                    <not>
                        <equals arg1="yes" arg2="${do.proceed}" />
                    </not>
                </condition>
            </fail>
           
            <java
                classname="testutils.HibernateTableSchemaCreation"
                classpathref="project.classpath" /> <!-- 여기에 Hibernate3.jar 등이 들어있어야한다. -->
        </target>

 

  • 테이블 생성 스크립트만 Ant로 얻어오는 방법도 있다. 원칙적으로는 위 Java 클래스가 해주는 직접적인 DB 테이블 수정도 가능하다고 하는데, 나는 자꾸 NullPointerException이 발생해서 Script를 가져오는 것까지만으로 사용한다.
  1.     <taskdef name="schemaexport"
            classname="org.hibernate.tool.hbm2ddl.SchemaExportTask"
            classpathref="project.classpath" />
  2.     <target name="db-create-schema-ddl" depends="prepare">
            <schemaexport config="${src.dir}/hibernate.cfg.xml"
                quiet="no" text="yes" drop="no" create="yes"
                delimiter=";" output="${build.dir}/db-create.ddl">
            </schemaexport>
        </target>

        <target name="db-drop-schema-ddl" depends="prepare">
            <schemaexport config="${src.dir}/hibernate.cfg.xml"
                quiet="no" text="yes" drop="yes" create="no"
                delimiter=";" output="${build.dir}/db-drop.ddl">
            </schemaexport>

 

Spring + Hibernate 에서 스키마 DDL 출력

  1.         String[] paths = { "WebContent/WEB-INF/applicationContext-*.xml" };
            ApplicationContext ctx = new FileSystemXmlApplicationContext(paths);
            LocalSessionFactoryBean lsfb = (LocalSessionFactoryBean) ctx
                    .getBean("&sessionFactory");
            String[] creationSchemas = lsfb.getConfiguration()
                    .generateSchemaCreationScript(
                            Dialect.getDialect(lsfb.getConfiguration()
                                    .getProperties()));


            for (String schema : creationSchemas) {
                System.out.println(schema);
            }

 

 

Post a comment

Options:

Size

Colors