클래스 상속을 매핑하는 가장 쉬운 방법은 하나의클래스 계층도에 대해 하나의 테이블을 할당 하는 경우.
CAREER 테이블은 Career 클래스, CompanyCareer 클래스 그리고 SchoolCareer 클래스가 갖는 모든 프로퍼티와 매핑될 칼럼을 가지고 있다.
데이터베이스 테이블 만들기
create table CAREER( id integer(10) not null auto_increment primary key, name varchar(50), begin_date timestamp, end_date timestamp, business varchar(255), major varchar(50), graduate_yn char(1), career_type char(20) );
데이터베이스 테이블 만들기 하이버네이트 설정 파일
<hibernate-mapping package="kame.hibernate.chap05.model"> <class name="Career" table="CAREER"> <id name="id" column="ID" type="int"> <generator class="identity" /> </id> <discriminator column="CAREER_TYPE" type="string" /> <property name="name" column="NAME" type="string" /> <property name="beginDate" column="BEGIN_DATE" type="timestamp" /> <property name="endDate" column="END_DATE" type="timestamp" /> <subclass name="CompanyCareer" discriminator-value="CC" > <property name="business" column="BUSINESS" type="string" /> </subclass> <subclass name="SchoolCareer" discriminator-value="SC" > <property name="major" column="MAJOR" type="string" /> <property name="graduate" column="GRADUATE_YN" type="yes_no" /> </subclass> </class> </hibernate-mapping>
하이버네이트 설정 파일 테스트 파일
public class CareerOneTest { private Session session = HibernateUtil.getCurrentSession(); @Before public void before() { HibernateUtil.beginTransaction(); } @After public void after() { HibernateUtil.closeSession(); } @Ignore public void insertCompanyCareer() { try { CompanyCareer companyCareer = new CompanyCareer(); companyCareer.setName("다음 커뮤니케이션"); companyCareer.setBusiness("기술"); companyCareer.setBeginDate(new Date()); companyCareer.setEndDate(new Date()); session.save(companyCareer); HibernateUtil.commitTransaction(); } catch(Throwable ex) { HibernateUtil.rollbackTransaction(); ex.printStackTrace(); } } @Ignore public void insertSchoolCareer() { try { SchoolCareer schoolCareer = new SchoolCareer(); schoolCareer.setName("순천대학교"); schoolCareer.setGraduate(false); schoolCareer.setMajor("멀티미디어공학"); session.save(schoolCareer); HibernateUtil.commitTransaction(); } catch(Throwable ex) { HibernateUtil.rollbackTransaction(); ex.printStackTrace(); } } @Test public void getCompanyCareer() { try { Career companyCareer = (Career)session.get(Career.class, new Integer(1)); System.out.println(companyCareer.getName()); } catch(Throwable ex) { HibernateUtil.rollbackTransaction(); ex.printStackTrace(); } } @Test public void getSchoolCareer() { try { SchoolCareer schoolCareer = (SchoolCareer)session.get(SchoolCareer.class, new Integer(2)); System.out.println(schoolCareer.getMajor() + " " + schoolCareer.getName()); } catch (Throwable e) { HibernateUtil.rollbackTransaction(); e.printStackTrace(); } } }
테스트 파일 클래스 상속 계층을 하나의 테이블에 넣는 방식은 다음과 같은 장점을 가진다.
- 매핑이 간단하다.
- 성능이 좋다.
- 하위 클래스의 프로퍼트와 매핑될 칼럼은 기본적으로 null이어야 한다.
- 새로운 하위 클래스가 추가될 경우 테이블을 변경해야 한다.