2013-02-04 1 views
0

GWT + Hibernate 프로젝트의 설계 결정에 직면하고 있습니다.setter에서 유효성 검증을 구현하거나 Hibernate Validator를 사용하십시오.

나는 회사 엔티티를 사용하여 나의 질문을 설명 할 것이다.

@Entity 
@Table(name = "Company") 
public class Company extends LightEntity implements BaseSerializable { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name = "Id") 
    private int id; 

    @Column(name = "Code") 
    private String code; 
    @Column(name = "Name") 
    private String name; 

    @Column(name = "Address") 
    private String address; 

    @Column(name = "ContactNumber1") 
    private String contactNumber1; 

    @Column(name = "ContactNumber2") 
    private String contactNumber2; 

    @Column(name = "EMail") 
    private String email; 

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "company", cascade = CascadeType.ALL) 
    private List<CompanyRegistration> companyRegistrations = new ArrayList<CompanyRegistration>(); 

    public Company() { 
    } 
    public Company(String code, String name) { 
     this.setCode(code); 
     this.setName(name); 
    } 

    // getters & setters 
} 

유효한 회사 개체는 항상 유효한 코드와 이름을 가져야합니다. 나머지 속성은 선택 사항입니다. 따라서 유효한 객체를 만들 수 있도록 두 개의 args 생성자를 제공했습니다.

지금.

저는 설정자의 데이터를 확인하는 데 사용됩니다. 나는 또한이 생성자를 내 생성자 (들)에서 사용한다. 이것들은 새로운 객체가 항상 유효한 상태인지 확인합니다. 이것은 Hibernate 엔티티 구현에 대한 나의 계획이었습니다.

그러나 GWT-RPC는 지연없는 바인딩에 사용할 수 있도록 기본 noargs 생성자를 지정합니다. 하지만 그렇게하면 누구나 빈 객체를 생성 할 수있게되어 대부분의 Hibernate 엔티티에서는 바람직하지 않습니다. 예를 들어, 회사는 항상 코드와 이름으로 작성되어야합니다. noargs 생성자는 해당 규칙을 무시합니다.

이제 Hibernate는 유효성 확인 프레임 워크에 대한 표준 (내 메모리가 나를 배신하지 않으면 JSR-303)을 구현했습니다. 이미 생성 된 개체에 대해 유효성 검사를 호출 할 수 있습니다.

noargs 생성자로 인해 내 문제가 발생했습니다. 그것이 필수적이지 않은 경우, 나는 setter에서 유효성 검사를하지 않았을 것입니다.

setters에서 유효성 검사를 구현하면 유효하지 않은 개체가 가능한 빨리 실패합니다. 클라이언트 쪽 개체에 대한 유효성 검사를 호출 할 필요가 없습니다. 그러나 빈 객체 (noargs 생성자를 사용하여 생성)는 그런 식으로 유효성을 검사 할 수 없습니다. 그것은 서비스에 영향을 미칠 수 있습니다. 이는 서비스 레이어에서 설정 자와 동일한 많은 검증을 구현해야 함을 의미합니다.

유효성 검사 프레임 워크를 구현하면 클라이언트 측에서 만드는 각 개체에 대해 유효성 검사를 호출해야합니다. 유효성을 확인하는 것을 잊어 버린 경우 잘못된 상태의 서비스 계층으로 이동할 수 있습니다. 그러나 서비스 계층에서 동일한 프레임 워크를 쉽게 사용할 수 있습니다.

내가 생각한 솔루션 중 하나는 setter에서 유효성 검사를 구현하는 것뿐 아니라 데이터베이스에서 유지할 개체를 보내기 전에 서비스 계층에서 유효성 검사기를 사용하는 것입니다. 그렇게하면 클라이언트 측이 자동으로 설정자에 의해 제한됩니다. 반면에 빈 객체가 서버 측으로 전송되면 서비스 계층의 Validator에 의해 캐치됩니다. 두 경우 모두 사용자에게 예외가 발생합니다.

그러나 이것이 최선의 해결책은 아니라고 생각합니다. 그래서 나는 하나를 사고 싶다.

EDIT - 어쨌든 엔티티 필드에 제약 조건을 넣기 위해 어노테이션을 사용하고 있기 때문에, Hibernate는 객체를 영속화하기 전에 검증을 위해 사용할 수 있습니다.

답변

1

GWT-RPC의 필수 0 인수 생성자에서만 문제가 발생하는 경우이 생성자를 개발자가 액세스 할 수 없도록 만들 수 있습니다 (원하는 경우 private도 가능). GWT-RPC는 가시성에 상관없이 리플렉션을 사용하여 액세스합니다.

+0

음, blimey! 나는 그런 생각을하지 못했다. 방금 기본 생성자를 private로 만들었고 작동했습니다! 나는 이것이 내 문제를 끝내는 것 같아. 그러나 이것이 유일한 문제가 아니었다면 당신이 실제로하고 싶은 것이 무엇인지 알고 싶습니다. –

+0

나는 세터에 검증을 구현하기로 결정했습니다.noargs 생성자 문제가 지금 해결되면 내 응용 프로그램은 항상 객체에 대해 유효한 상태를 갖게됩니다. 서비스 계층은 여전히 ​​유효성 검사로서 not-null 제약 조건을 갖습니다. 그러나 필요하다면 서비스 레이어에서 Hibernate Validator를 사용하여 유효성을 검사 할 수 있도록 엔티티에 Hibernate 제약 주석을 구현할 것이다. –