'웹개발(JSP&Servlet)/Hibernate'에 해당되는 글 14건

  1. 2010.06.01 Hibernate의 컴포넌트
  2. 2010.06.01 개체(Entity)타입과 값(Value) 타입
  3. 2010.06.01 복합 키 매핑 처리
EMOPLOYEE 테이블이 스키마가 다음과 같을때
 EMPLOYEE
 ID
 KOR_SURNAME
 KOR_NAME
 ENG_SURNAME
 ENG_NAME

<component> 태크로 컴포넌트 매핑하기

<class name="Employee" table="EMPLOYEE">
  <id name="id" column="ID" type="int">
    <generator class="identity" />
  </id>

  <component name="korName" class="Name">
    <property name="surname" column="KOR_SURNAME" />
    <property name="name" column="KOR_NAME" />
  </component>

  <component name="engName" class="Name">
    <property name="surname" column="ENG_SURNAME" />
    <property name="name" column="ENG_NAME" />
 </component>
</class>
<component>의 name은 프로퍼티의 이름,  class는 값 타입으로 사용되는 클래스를 의미.
korName프로퍼티의 surname프로퍼티는  KOR_SURNAME칼럼과 매핑된다.

<component>로  매핑되는 클래스도 기본 생성자를 제공해야 함
public class Name {
  private String surname;
  private String name;

  public Name(String surname, String name) {
    this.surname = surname;
    this.name = name;
  }

  public Name() {}

  public void setName() ....

  public String getSurname() ....

  ..
}

example
Employee emp = new Employee();
Name korName = new Name("박", "지성");
Name engName = new Name("Park", "Jisung");
emp.setKorName(korName);
emp.setEngName(engName);
session.save(emp);

Employee emp = (Employee)session.get(Employee.clss, new Integer(1));
Name korName = emp.getKorName();
korName.getSurName();
....

컴포넌트에서 부모객체 참조하기

public class Name {
  private Employee employee;
 
  public Employee getEmployy() {
    return employee;
  }

  public void setEmployee(Employee employee) {
    this.employee = empoyee;
  }

  ..
}

<parent> 로 부모객체를 명시
<class name="Employee" table="EMPLOYEE">
  ..
  <component name="forName" class="Name">
    <parent name="employee" />
    <property name="surname" column="KOR_SURNAME" />
    ..
  </component>
</class>

example
Employee emp = (Employee) session.get(Employee.class, new Integer(1));
Name korName = emp.getKorName();
..
korName.getEmployee();

컴포넌트 중첩
<class name="Employee" table="EMPLOYEE">
  ..
  <component name="korName" class="Name">
    <property name="surName" column="KOR_SURNAME" />
    <property name="name" column="KOR_NAME" />
  
    <component name="familyInfo" class="FamilyInfo">
      <property name="origin" column="FAMILY_ORIGIN" />
      ..
    </component>
  </component>
</class>

 

Posted by 영겁회귀

댓글을 달아 주세요


public class User {
  private int id;
  private Address address;
  ..
}

public class User {
  private int id;
  private address address;
  ..
}

상단은 User와 Address가 N-1을 가지고 있다. Address는 User에 독립적이며, 개별적인 수명주기를 가지고 있다 이때 Address를 Entity(개체) 타입이라 한다.
하단의 경우 User와 Address는 상단과 클래스의 형식이 같지만, User와 수명주기가 같아, 이처럼 다른 객체에 생명주기를 의존하고 있는 객체를 Value(값)타입이라고 한다.

Posted by 영겁회귀

댓글을 달아 주세요

<id> 태그 대신에 <composite-id>태그를 사용하여 주요 키 칼럼에 대한 매핑을 설정해야함.
<class name="SecurityNoInfo" table="SECURITY_NON_INFO">
  <compoiste-id>
    <key-property name="securityNo1" column="SECNO1" />
    <key-property name="securityNo2" column="SECNO2" />
  </composite-id>

  <property name="name" column="NAME" />
</class>
<key-property>는 복합키로 사용된ㄴ 칼럼들과 클래스 프로퍼티 사이의 매핑 정보를 설정.

복합키를 사용하는 클래스는 java.io.Serializable 인터페이스를 구현해야함
해당 클래스의 객체가 식별자 값으로도 사용되기 때문.
public class SecurityNoInfo implements Serializable {
  ...
}

SecurityNoInfo sni = new SecurityNoInfo();
sni.setSecurityNo1("12334");
sni.setSecurityNo2("12345");
SecurityNoInfo loaded = (SecurityNoInfo) session.get(SecurityNonInfo.class, sni);
  Object load(Class theClass, Serializable id)
          Return the persistent instance of the given entity class with the given identifier, assuming that the instance exists.
SecurityNoInfo의 객체가 키값으로 사용됨.
식별자로 사용한 객체에 값을 저장할수도 있음
session.loaded(sni, sni);

복합 키 클래스
public class SecurityNoInfo implements Serializable {
  private String securityNo1;
  private String securityNo2;

 //get/set methods...
}

복합키를 저장하기 위하여 별도의 클래스가 존재한다면
SecurityNoInfo 클래스가 복합키를 위한 식별자로 사용할수 있도록 변경가능
public class SecurityNoInfo {
  private SecurityNoKey id;
  private String name;
  ..
  //get/set methods

  // equals / hashCode 메소드 구현
}
식별값을 표현하기 위해 SecurityNoInfo 클래스를 사용할 필요없음 -> Serializable 구현필요없음

<composite-id>태그에서 식별자로 사용할 클래스를 지정해 준다.
<class name="SecurityNoInfo" table="securityNoInfo">
  <composite-id name="id" class="SecurityNoKey">
    <key-composite name="securityNo1" column="securityNo1" />
    <key-composite name="securityNo2" column="securityNo2" />
  </composite-id>

  <property name="name" />
</class>
SecurityNoInfo 클래스의 식별자는 SecurityNoKey  클래스로 표현되며, SecurityNoKey클래스의 객체를 Session.get()/Session.load()  메소드에 식별자(파라미터)로 전달할수 있다.
SecurityNoKey key = new SecurityNoKey();
key.setSecurityNo1.set("12234");
key.setSecurityNo2.set("12311");
SecurityNoInfo sni = (SecurityNoInfo) session.get(SecurityNoKey.class, key);


Posted by 영겁회귀

댓글을 달아 주세요