'컴포넌트'에 해당되는 글 2건

  1. 2010.06.14 컴포넌트 타입의 컬렉션
  2. 2010.06.01 Hibernate의 컴포넌트

LOG_IMAGEFILE 테이블은 LIST타입과 매핑되는 컬렉션 테이블임.
매핑될 칼럼이 3(NAME, SIZEX, SIZEY)이므로 컴포넌트 타입을 사용해야 할것이다.
package pe.hibernate.chap04.model;

public class ImageFile {
private String name;
private int sizeX;
private int sizeY;

public ImageFile() {}

@Override
public int hashCode() {
final int PRIME = 31;
int result = 1;
result = PRIME * result + ((name== null) ? 0 : name.hashCode());
result = PRIME * result + sizeX;
result = PRIME * result + sizeY;
return result;
}

@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (obj == null) resurn false;
if (getClass() != obj.getClass()) return false;
final ImageFile other = (ImageFile) obj;
if (name == null) {
if (other.anme != null) return false;
} else if (!name.equals(other.name)) {
return false;
}
if (sizeX != other.sizeX) return false;
if (sizeY != other.sizeY) return false;
return true;
}
}
모든 컴포넌트 타입의 클래스에서 equals()와 hashCode()를 구현할 필욘없다.
equals()와 hashCode() 는 set타입의 저장될 경우에 구현해야 한다.
public class Log {
private List<ImageFile> imageFiles = new ArrayList<ImageFile>();
...
}
컴포넌트 타입의 컬렉션 매핑을 설정하는 방법은 기본 데이터 타입의 컬렉션 매핑과 비슷.
<element>태그 대신 <composite-element> 태그를 사용.
<list name="imageFiles" table="LOG_IMAGEGFILE">
<key column="LOGID" />
<list-index column="POSITION" base="1" />
<composite-element class="ImageFile">
<property name="name" column="NAME" />
<property name="sizeX" column="sizeX" />
<property name="sizeY" column="sizeY" />
</composite-element>
</list>

sort 및 order-by 속성을 이용한 컴포넌트 타입의 정렬
SortedMap  컬렉션이나 SortedSet컬렉션에 저장될 컴포넌트 타입을 정렬할 때에도 sort 속성을 사용.
sort 속성의 값을 natural로 지정할 경우 컴포넌트 타입 클래스는 Comparable 인터페이스를 구현해주어야 한다.
package pe.hibernate.chap02.model;

public class ImageFile implements Comparable<ImageFile> {
private String name;
....
public int compareTo(ImageFile to) {
return this.getNames().compareTo(to.getName());
}
}
Comparable 인터페이스를 구현하지 않도록 하려면, 직접 구현해서 sort 속성에 명시해 주어야 한다.
 public class ImageFileComparator implements Comparator<ImageFile> {
public int compare(ImageFile 01, ImageFile 02) {
return 01.getName().compareTo(o2.getName());
}
}
order-by 속성을 사용할 경우 DBMS에서 정렬을 수행하므로 컴포넌트 타입 클래스가 Comparable인터페이스를 구현할 필요한 없으며, 또한 Comparator 구현체를 통해 제공할 필요도 없다.

부모 객체 참조하기
<parent>태그를 사용 부모 객체를 참조할수 있도록 함
<component name="korName" class="Name">
<parent name="employee" />
<property name="surname" column="KOR_SURNAME" />
...
</component>
<composite-element>태그를 사용할때에도 <component>태그를 사용할 때처럼 <parent>태그 사용가능
<set name="imageFiles" table="LOG_MANAGER">
<key column="LOGID" />
<composite-element class="ImageFile">
<parent name="log" />
<property name="name" column="NAME" />
<property name="sizeX" column="sizeX" />
<property name="sizeY" column="sizeY" />
</composite-element>
</sex>
저작자 표시
신고
Posted by 영겁회귀
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 영겁회귀

티스토리 툴바