JBoss Hibernate Tools 를이용한 Entity 코드생성하기 OOP 개발교육의중심오라클자바커뮤니티 http://ojc.asia DDL 코드가작성되어있거나운영중인서비스를업그레이드하는경우에는 ORM 개발이라고하더라도 Top-down 방식의 개발방법론만을고집하지말고때에따라서는전통적인방식의접근이편리할것이다. 데이터베이스의이미존재하는테이블을바탕으로리버스엔지니어링을통해 JPA 등에서사용할모델 Entity 코드를생성해보자. 테이블이많을수록자동생성되는코드를이용하면개발의생산성을높일수있을것이다. 1. 이클립스설치 최신 STS 에서는버전문제로제대로작동하지않을수있다. 따라서 eclipse mars 1 버전을사용하겠다. 사실코드생성용으로별도의이클립스를사용함이여러모로편리하다. 주의 : 이클립스버전에맞는플러그인이존재하는지확인하고작업함을권장합니다. 다음사이트에서 OS 환경에맞는이클립스를다운로드후설치하고기동한다. http://www.eclipse.org/downloads/packages/ 2. 플러그인설치 1. Help > Eclipse Marketplace 창을띄운후 'jboss' 키워드로검색한다. 2. JBoss Tools 4.3.0.Final 의 install 버튼을클릭한다. 3. 설치전체체크를해제하고오직 Hibernate Tools 항목만을체크하고설치한다. 플러그인설치가끝나면이클립스의재시작이필요하다. 3. 결과저장용프로젝트생성 생성되는파일을저장할프로젝트가필요하다. 간단히 Dynamic Web Project 로하나만든다. 주의 : Java Project 로만들지않는다. 시도해보는것을말리지는않겠다. 4. 데이터베이스연결정보파일생성 프로젝트자바루트 src 폴더에다음내용으로파일을만들자. 사실위치가중요하지는않다. hibernate.cfg.xml <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> <hibernate-configuration>
<session-factory> <property name="hibernate.connection.driver_class">oracle.jdbc.driver.oracledriver</property> <property name="hibernate.connection.url">jdbc:oracle:thin:@192.168.0.27:1521:onj</property> <property name="hibernate.connection.username">scott</property> <property name="hibernate.connection.password">tiger</property> <property name="hibernate.dialect">org.hibernate.dialect.oracle10gdialect</property> <property name="hibernate.default_schema">scott</property> <property name="show_sql">true</property> </session-factory> </hibernate-configuration> 5. 데이터베이스연결드라이버 오라클데이터베이스라면 WebContent/WEB-INF/lib 폴더에 OracleDriver 인 ojdbc6.jar 파일을복사해넣는다. 다른데이터베이스라면적절히 hibernate.cfg.xml 파일의내용을바꾸고그에맞는드라이버를사용하면된다. 6. Hibernate Perspective 하이버네이트퍼스펙티브로변경한다. 왼쪽의 Hibernate Configurations 창에서마우스오른쪽버튼 > Add Configuration... 을클릭하면다음창이뜬다.
1. Browse 버튼을클릭하여미리만들어놓은프로젝트를선택한다. 2. New 버튼을클릭하여 Database connection 을설정한다. 자세한설정방법은생략한다. 3. Setup 버튼을클릭하여미리만든 hibernate.cfg.xml 파일을선택한다. 연결설정작업이다되었다. 창하단에 OK 버튼을누른다. Hibernate Configuration 뷰를보면 hibernate 라는항목이추가된것이보일것이다. Database 부분을눌러서밑으로확장해들어가면 scott 계정으로접근할수있는테이블목록이보일것이다. 테이블정보가보인다는것은설정작업이잘된것을의미한다. 7. Code Generation 이제코드생성을해보자. 다음그림을참고하여 Hibernate Code Generation 메뉴를선택한다.
새로뜬창에서 New launch configuration 아이콘을클릭한다. 다음그림을참고하여설정작업을진행한다.
1. Output directory : 생성되는파일이저장되는위치가된다. 2. 설정하지않으면계정의모든테이블을대상으로작업이진행된다. 테이블몇개만을대상으로 Entity 모델객체를얻고자한다면설정할필요가있다. 참고로만들어지는리버스엔지니어링파일내용은다음과같다. hibernate.reveng.xml <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-reverse-engineering PUBLIC "-//Hibernate/Hibernate Reverse Engineering DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-reverse-engineering-3.0.dtd" > <hibernate-reverse-engineering> <table-filter match-name="dept"/> <table-filter match-name="emp"/> </hibernate-reverse-engineering> 다음으로 Exporters 탭메뉴에서다음과같이설정한다.
끝으로하단에 Run 버튼을클릭하면리버스엔지니어링작업이진행되고결과적으로지정된프로젝트의지정된폴더에테이블과 대응하는 Entity 모델객체.java 파일들이만들어진다. 8. 작업결과 작업결과예시는 scott 계정에테스트용테이블인 Dept 와 Emp 에대응하는 Entity 모델객체의.java 파일이다. Dept.java // default package // Generated 2016. 2. 12 오후 5:39:01 by Hibernate Tools 4.3.1.Final import java.util.hashset; import java.util.set; import javax.persistence.column; import javax.persistence.entity; import javax.persistence.fetchtype; import javax.persistence.id; import javax.persistence.onetomany; import javax.persistence.table; /** * Dept generated by hbm2java */ @Entity @Table(name = "DEPT") public class Dept implements java.io.serializable { private byte deptno; private String dname; private String loc; private Set<Emp> emps = new HashSet<Emp>(0); public Dept() { public Dept(byte deptno) { this.deptno = deptno; public Dept(byte deptno, String dname, String loc, Set<Emp> emps) { this.deptno = deptno; this.dname = dname; this.loc = loc; this.emps = emps; @Id @Column(name = "DEPTNO", unique = true, nullable = false, precision = 2, scale = 0) public byte getdeptno() {
return this.deptno; public void setdeptno(byte deptno) { this.deptno = deptno; @Column(name = "DNAME", length = 14) public String getdname() { return this.dname; public void setdname(string dname) { this.dname = dname; @Column(name = "LOC", length = 13) public String getloc() { return this.loc; public void setloc(string loc) { this.loc = loc; @OneToMany(fetch = FetchType.LAZY, mappedby = "dept") public Set<Emp> getemps() { return this.emps; public void setemps(set<emp> emps) { this.emps = emps; Emp.java // default package // Generated 2016. 2. 12 오후 5:39:01 by Hibernate Tools 4.3.1.Final import java.math.bigdecimal; import java.util.date; import javax.persistence.column; import javax.persistence.entity; import javax.persistence.fetchtype; import javax.persistence.id; import javax.persistence.joincolumn; import javax.persistence.manytoone;
import javax.persistence.table; import javax.persistence.temporal; import javax.persistence.temporaltype; /** * Emp generated by hbm2java */ @Entity @Table(name = "EMP") public class Emp implements java.io.serializable { private short empno; private Dept dept; private String ename; private String job; private Short mgr; private Date hiredate; private BigDecimal sal; private BigDecimal comm; public Emp() { public Emp(short empno) { this.empno = empno; public Emp(short empno, Dept dept, String ename, String job, Short mgr, Date hiredate, BigDecimal sal, BigDecimal comm) { this.empno = empno; this.dept = dept; this.ename = ename; this.job = job; this.mgr = mgr; this.hiredate = hiredate; this.sal = sal; this.comm = comm; @Id @Column(name = "EMPNO", unique = true, nullable = false, precision = 4, scale = 0) public short getempno() { return this.empno; public void setempno(short empno) { this.empno = empno; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "DEPTNO")
public Dept getdept() { return this.dept; public void setdept(dept dept) { this.dept = dept; @Column(name = "ENAME", length = 10) public String getename() { return this.ename; public void setename(string ename) { this.ename = ename; @Column(name = "JOB", length = 9) public String getjob() { return this.job; public void setjob(string job) { this.job = job; @Column(name = "MGR", precision = 4, scale = 0) public Short getmgr() { return this.mgr; public void setmgr(short mgr) { this.mgr = mgr; @Temporal(TemporalType.DATE) @Column(name = "HIREDATE", length = 7) public Date gethiredate() { return this.hiredate; public void sethiredate(date hiredate) { this.hiredate = hiredate; @Column(name = "SAL", precision = 7) public BigDecimal getsal() { return this.sal;
public void setsal(bigdecimal sal) { this.sal = sal; @Column(name = "COMM", precision = 7) public BigDecimal getcomm() { return this.comm; public void setcomm(bigdecimal comm) { this.comm = comm; Dept 테이블과 Emp 테이블은 1:N 관계다. Emp 테이블안에 DEPTNO 칼럼이 FK 다. 그래서연관관계 Owner 가된다. Dept 클래스의 emps 필드변수에 mappedby 설정을함으로서 Emp 클래스의 dept 필드변수가연관관계를관리한다는것을표시하며 Dept 테이블에 emps 라는칼럼생성을막고있다. 논리모델을통해객체 물리모델생성이표준이지만그반대도많이연습한다면최적의성능을고려할수있는좋은 ORM 개발자가되는데도움이되리라생각된다. 지금까지수고하셨습니다.