작명 지침 사용하기

특징

  • Hibernate provides a feature that allows you to enforce naming standards automatically.

설정하기

  • NamingStrategy 인터페이스 구현하기
  • ImprovedNamingStrategy 클래스 상속받아서 구현하기
네임스페이스 등록하기
import org.hibernate.cfg.ImprovedNamingStrategy;
import org.hibernate.util.StringHelper;

public class CENamingStrategy extends ImprovedNamingStrategy {
public String classToTableName(String className) {
return StringHelper.unqualify(className);
}

public String propertyToColumnName(String propertyName) {
return propertyName;
}

public String tableName(String tableName) {
return "CE_" + tableName;
}

public String columnName(String columnName) {
return columnName;
}

public String propertyToTableName(String className, String propertyName) {
return "CE_" + classToTableName(className) + '_'
+ propertyToColumnName(propertyName);
}
}
  • classToTableName(): <class> 맵핑에서 table 속성에 값을 입력하지 않았을 때 호출.
  • propertyToColumnName(): 명시적인 column 이름을 설정하지 않았을 때 호출.
  • tableName(), columnName(): 명시적으로 이름을 설정했을 때 호출.
  • 동적으로 설정을 바꿀 수 있음.
동적으로 네임스페이스 바꾸기
Configuration cfg = new Configuration();
cfg.setNamingStrategy( new CENamingStrategy() );
SessionFactory sessionFactory sf =
cfg.configure().buildSessionFactory();

모르는 것

  • SessionFactory 설정할 때 구현한 클래스를 등록해 주면 되는건가?

SQL문에 따옴표 사용하기

특징

  • Hibernate doesn’t quote table and column names in the generated SQL.
  • 대소문자를 구분하거나, 특수 문자를 사용하는 기존 DB의 경우 하이버네이트가 자동으로 생성하는 컬럼이나 테이블이름을 인식하지 못할 수도 있다.

설정하기

역따옴표 사용하기
<property name="description"
column="`DESCRIPTION`"/>
  • If you quote a table or column name with backticks in the
    mapping document, Hibernate always quotes this identifier in the
    generated SQL.
  • 애노테이션에서도 설정할 수 있으나, 하이버네이트 @Column 애노테이션을 사용하야 한다. JPA에서는 지원하지 않는다.

패키지 이름 설정하기

특징

  • (XML 설정 파일 이용 시)
  • Persistent 클래스 등록할 때, 패키지 이름까지 붙어있는 이름을 등록해야 한다.
  • 같은 패키지에 위치한 여러 클래스들을 등록할 때 패키지 이름을 매번 붙여주기가 귀찮다.

설정하기

기본 패키지 설정하기
<hibernate-mapping package="auction.model">
<classname="Item" table="ITEM">
...
</class>
</hibernate-mapping>
  • 애노테이션에서는 이런 설정이 필요 없겠지. 해당 클래스에 가서 직접 붙여주는데…

쿼리에서 사용할 Entity 이름 설정하기

특징

  • 기본으로 모든 클래스 이름들이 자동으로 HQL의 네임스페이스로 import 된다.
  • 즉, HQL에서 패키지 이름을 제외한 클래스 이름을 사용할 수 있다.
  • 서로 다른 패키지에 같은 이름의 클래스가 존재한다면, auto-import를 끄거나, 명시적으로 네임스페이스를 설정해야 한다.

설정하기

HQL에서 사용할 네임스페이스 설정하기
@Entity(name="AuctionItem")
public class Item {

}

모르는 것

  • 애노테이션을 사용해서 auto-import를 끄는 방법은?
  • auto-import를 끄면 패키지 이름이 붙어있는 클래스 이름을 네임스페이스로 사용하는 건가?

Immutable Entity 만들기

특징

  • 변하지 않아야 할 Persistent 객체가 있을 수 있다.
  • 이런 Persistent 클래스에는 필드로 직접 접근하도록 설정하고, accessor 메소드들을 만들지 않으면 된다.

설정하기

immutable entity 설정하기
@Entity
@org.hibernate.annotations.Entity(mutable=false)
@org.hibernate.annotations.AccessType("field")
public class Bid {

}
  • @AccessType은 하이버네이트가 Pesistent 클래스에 접근하는 방법을 표시한다.
  • 클래스, 메소드, 필드 위에 붙여서 좀 더 세밀한 설정이 가능하다.