테이블자동생성 Ant Script
Hibernate 테이블 자동생성 Ant Script
- 아래 과정과 상관없이, hibernate.hbm2ddl.auto 프라퍼티를 true로 지정하면, 스키마가 바뀌고, Hibernate 설정이 다시 로딩 될 때 마다 스키마를 재구성해준다. 테스트 환경에서는 이 속성을 사용하는 것이 편하다.
- Hibernate 단독 사용시, 테이블을 자동으로 생성해주는 Hibernate Java Code는 다음과 같다.
-
package testutils;
-
import org.hibernate.cfg.Configuration;
-
import org.hibernate.tool.hbm2ddl.SchemaExport;
-
public class HibernateTableSchemaCreation {
-
public static void main(String[] args) {
-
Configuration cfg = new Configuration().configure("hibernate.cfg.xml");
-
SchemaExport schemaExport = new SchemaExport(cfg);
-
schemaExport.create(true, true);
-
System.out.println("테이블 스키마를 리셋하였습니다.");
-
}
-
}
- Spring 2.0에 연동해서 사용할 때는 hibernate.cfg.xml 파일이 없기 때문에 다음과 같이 Spring에서 제공해주는 기능을 이용한다. LocalSessionFactoryBean의 id가 "sessionFactory"로 지정돼 있을 때를 가정했다. 아래와 같이 Bean을 얻어올 때 앞에 & 기호가 있어야만 LocalSessionFactoryBean의 객체를 가져올 수 있다.
-
package testutils;
-
import org.springframework.context.ApplicationContext;
-
import org.springframework.context.support.FileSystemXmlApplicationContext;
-
import org.springframework.orm.hibernate3.LocalSessionFactoryBean;
-
public class HibernateTableSchemaCreation {
-
public static void main(String[] args) {
-
-
String [] paths = { "WebContent/WEB-INF/applicationContext-*.xml" };
-
ApplicationContext ctx = new FileSystemXmlApplicationContext(paths);
-
LocalSessionFactoryBean lsfb = (LocalSessionFactoryBean)ctx.getBean("&sessionFactory");
-
lsfb.dropDatabaseSchema();
lsfb.createDatabaseSchema(); -
System.out.println("테이블 스키마를 리셋하였습니다.");
-
}
-
}
위 클래스를 Ant에 등록해서 사용할 수 있다.
- <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를 가져오는 것까지만으로 사용한다.
- <taskdef name="schemaexport"
classname="org.hibernate.tool.hbm2ddl.SchemaExportTask"
classpathref="project.classpath" /> - <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 출력
- 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);
}
