Accessor 메소드에 로직 추가하기

Setter 메소드에 Validation 로직 추가.

  • 하이버네이트가 DB에서 데이터를 가져올 때 이 Setter 메소드를 사용하여 속성을 설정하는데, 그럴 경우에는 validation을 하지 않고 변수에 직접 접근하도록 설정할 수 있다. 어떻게? p122 첫 줄.

Getter 메소드에서 복사체 전달.

  • 하이버네이트는 Dirty Checking을 하기 때문에, Persistent 상태의 객체 속성의 변경을 DB에 반영하기 위해 UPDATE문을 자동으로 실행한다.
  • Getter에서 같은 값의 다른 객체를 반환하더라도 불필요한 Update문을 실행하지 않는다.
다른 객체 반환하는 Getter
public String getFirstname() {
return new String(firstname);
}
  • Hibernate compares the objects by value—not by object
    identity—to determine whether the property’s persistent state needs to
    be updated.
  • 하지만 Collection일 경우에는 예외이며, 이 경우 같은 객체들을 가진 다른 Collection 객체를 반환하면, 불필요한 UPDATE 문을 실행한다.
다음과 같이 하지 말 것
public void setNames(List namesList) {
names = (String[]) namesList.toArray();
}
public List getNames() {
return Arrays.asList(names);
}

예외 던지기

  • Runtime Exception이 발생하면, 트랜잭션을 롤백하고 Checked Exception이 발생하면, 하이버네이트가 잡아서 Runtime Exception으로 랩핑한다.

참조 : Java Persistence With Hibernate

POJO 관계 구현하기

Scaffolding code

  • 연관을 맺기 위해 필요한 필드와 메소드.

1:다 관계

  • 다수를 가질 경우, Hibernate requires interfaces for collection-typed attributes
  • 양방향일 경우, 해당 타입의 속성이 필요함.
  • 연결하기: 두 가지 행위가 필요함.
  • Hibernate doesn’t manage persistent associations. If you
    want to manipulate an association, you must write exactly the same code
    you would write without Hibernate.
  • Convenient Method 도입하기:
1:다 관계
public void addChildCategory(Category childCategory) {
if (childCategory == null)
throw new IllegalArgumentException("Null child category!");
if (childCategory.getParentCategory() != null)
childCategory.getParentCategory().getChildCategories().remove(childCategory);
childCategory.setParentCategory(this);
childCategories.add(childCategory);
}
    • reduces the lines of code
    • enforces the cardinality of the association

다:다 관계

  • both sides are implemented with collection-valued attributes.
  • Convenient Method
다:다 관계
public void addCategory(Category category) {
if (category == null)
throw new IllegalArgumentException("Null category");
category.getItems().add(this);
categories.add(category);
}
  • You can also add logic to your accessor methods.

참조 : Java Persistence With Hibernate

하이버네이트와 POJO

하이버네이트는 Pesistent 클래스가 Serializable 인터페이스를 구현하도록 강요하지 않지만, 객체가 HttpSession에 저장되어야 하거나 RMI를 사용하여 전송할 것이라면 구현해야한다.

JavaBeans 스펙은 특정 생성자를 필요로 하지 않지만, 하이버네이트(와 JPA)에서 모든 Persistent Class들은 인자가 없는 기본 생성자를 필요로 한다.

생성자는 public이 아니여도 괜찮지만, 만약에 프록시를 사용할 거라면, 최소한 package-visivle(public, protected, default 접근 지시자 사용 가능)해야한다.

프록시를 생성할 때는 클래스가 final이여서도 안되고 final 메소드를 가지고 있어도 안 된다!

Persistent Class 객체들의 상태를 어떻게 하이버네이트가 영속화할지는 필드에 직접 접근하거나 게터, 세터 메소드를 사용하는 방법 중에 선택할 수 있다.

참조 : Java Persistence With Hibernate

Transparent and automated persistence

Transparent

  • 도메인 모델의 영속성 클래스와 영속성 로직의 완전한 분리. transparent to mean a
    complete separation of concerns between the persistent classes of the
    domain model and the persistence logic, where the persistent classes
    are unaware of—and have no dependency on—the persistence mechanism.
  • Transparent persistence improves code readability and maintenance, as you’ll soon see.
  • Testability is a basic requirement for applications with rich domain models
  • Transparent persistence fosters a degree of portability

Automatic

  • 자주 사용하는 SQL과 JDBC API사용으로부터 사용자를 해방시켜준다는 것을 의미한다.

하이버네이트의 투명성

  • 도메인 클래스가 별도의 인터페이스를 구현하거나 상위 클래스를 상속 받지 않아도 된다.
  • 도메인 클래스를 영속성 문맥 밖에서도 사용 할 수 있다.
  • objects aren’t aware of the underlying data store.

참조 : Java Persistence With Hibernate

관심사 분리Seperation Of Concern

도메인에서 분리되어야 하는 이유

  • The domain model implementation is usually a central,
    organizing component; it’s reused heavily whenever you implement new
    application functionality. For this reason, you should be prepared to
    go to some lengths to ensure that concerns other than business aspects
    don’t leak into the domain model implementation.

관심사 누수leakage of concern

  • You shouldn’t put code that addresses these crosscutting
    concerns in the classes that implement the domain model. When these
    concerns start to appear in the domain model classes, this is an
    example of leakage of concerns.
  • EJB 컨테이너가 interseption을 사용해서 몇몇 leakage of concern을 해결했지만,
    EJB 2.1에서 도메인에 많은 규칙과 제약을 부과하는 바람에 관심사 누수가 생겼다. 이 경우에는 컨테이너 구현 관심사가 누수
    됐다. EJB 3.0은 이것을 반영해서 다시 비침략적nonintrusive이고 훨씬 전통적인 JavaBean 프로그래밍 모델에
    가까워졌다.

하이버네이트의 관심사

  • Hibernate is a solution for just one of these concerns: persistence.
  • Hibernate persistent classes and the EJB 3.0 entity
    programming model offer transparent persistence. Hibernate and Java
    Persistence also provide automatic persistence.

참조 : Java Persistence With Hibernate