2011-01-17 4 views
8

이 클래스가 있다고 가정합니다.최대 절전 모드와 함께 빌더 디자인 패턴을 사용할 수 있습니까?

public class MyEntity { 
    private int id; 
    private String name; 
    private MyEntity(int id, String name) {this.id= id; this.name = name;} 
    public static class MyEntityBuilder { 
    private int id; 
    private String name; 
    private MyEntityBuilder setId(int id) {this.id = id;} 
    private MyEntityBuilder setName(String name) {this.name = name;} 
    private MyEntity build() {return new MyEntity(id,name);} 
    } 
    private int getId() {return id;} 
    private String getName() {return name;} 
} 

최대 절전 모드 특수 효과를 사용하여 테이블에 매핑 할 수 있습니까?

답변

4

빌더는 오브젝트를 작성하기위한 외부 메커니즘입니다. 엔티티에 기본 생성자를 제공하는 것으로 충분하고 최대 절전 모드로 얻은 방법에 신경 쓰지 않아도됩니다. 그렇습니다. 정상적인 존재처럼 가능합니다.

5

예 아니요. setter도 제공하는 경우 사용할 수 있습니다.

Hibernate는 Java Beans를 사용하여 등록 정보에 액세스하므로 getXXX()setXXX() 메소드가 있음을 의지합니다. 빌더 패턴의 요점은 (적어도 조슈아 블로흐 (Joshua Bloch)에 따르면) 세터없이 불변의 객체를 만드는 것이다. 이것은 setter를 사용하여 값을 주입하기 때문에 Hibernate (또는 임의의 ORM)에서는 작동하지 않습니다.

하지만 빌더 API를 유익한 인터페이스로 사용하여 getter 및 setter를 그대로 유지하면서 객체를 생성하려는 경우 물론 코드 중복이 아닌 다른 문제는 없습니다.

진술 : 유창한 세터는 유효한 자바 빈즈 세터가 아닙니다. Introspector 메커니즘에서이를 이해하지 못합니다. setter에는 void 반환 유형이 있어야합니다.

+0

그게 뭐니? 나는 당신이 속성 접근 (장소에 @Column을 속성에서, 접근 방법이 아닌)을 선택하면 최대 절전 모드에서 설정 자와 함께 할 수 있다고 생각 했습니까? 또는 그들에게 prackage private ... 패턴에서 내부 빌더 클래스는 어떨까요? 그것은 최대 절전 모드에 대한 문제입니까? – bert

+1

@bert 당신의 말씨 조심해 : 당신이 묘사 한 것은 들판 접근이 아니라 속성 접근이다. Java에서 속성은 기본 필드가 아닌 getter 및/또는 setter 메서드로 정의됩니다. 필드에 주석을 추가 할 때 작동하지만 필드가 최종으로 표시되지 않은 경우 (빌더로 작성된 오브젝트의 우수 사례로 간주 됨). 내부 클래스는 정적이며 @Entity로 표시되지 않는 한 문제가되지 않습니다. –

+0

감사합니다. 그리고 당신은 당연히 맞습니다. 나는 재산 접근을 의미했다. 내 사용 사례는 매핑 된 필드가 'updatable = false'이고 API에서이를 적용하려고합니다. – bert

관련 문제