2011-08-09 4 views
6

이 간단한 질문에 대한 답을 알고 싶습니다.엔티티 규칙 만들기

엔티티 개체를 만들고 속성의 설정을 제한하려면 (예를 들어, 아무도 정수 값을 1보다 작게 설정할 수 없도록하려는 경우) 속성에 설정해야합니까? 이 속성의 설정자 또는이 객체를 처리하는 클래스에서이 제한을 확인해야합니까? 일반적으로 getter 및 setter를 구현할 수 있습니까?하지만 getter가 돌아가고 setter가 속성을 설정하는 한 오래 원하십니까?

나는 자바에 몇 가지 규칙 (코드 규칙)이 있다는 것을 안다. 그래서 그것들을 깨고 싶지는 않다.

미리 감사드립니다. 제 질문이 분명하고 문법상의 실수로 인해 유감스럽게 생각되기를 바랍니다. /.

답변

6

예 getters/setters는 유용합니다. 예를 들어

:

public void setAge(int age){ 
if(age < 0){ 
    throw new IllegalArgumentException("Invalid age : " + age); 
    //or if you don't want to throw an exception you can handle it otherways too 
} 
} 

또한 귀하의 질문에 대한 이해에서이

public class Person{ 

    @Min(value = 0) 
    @Max(value = 99) 
    private Integer age; 

    //some other code 
} 
+0

고마워요! 귀하의 도움을 많이 주셔서 감사 드리며 다른 접근법에 대해 알고 기뻐합니다. – VaclavDedik

+0

당신은 환영합니다 :) –

1

getters 및 setter의 목표입니다.

이러한 방법으로 동작을 추가 할 수 없다면 ... 공개 속성을 사용하지 않는 이유는 무엇입니까?

2

선호하는 접근 방식은 클래스 속성이 올바른지 확인하기 위해 JSR 303 (Bean 유효성 검사 API)을 사용하는 것입니다.

setter에서 유효성 검사를 수행하는 것은 꽤 괜찮은 방법이지만 항상 바람직한 방법은 아닙니다. 서로 관련이없는 여러 컨텍스트의 요구를 혼합 할 가능성이 있습니다. 예를 들어, 일부 속성은 사용자 인터페이스에서 설정하면 안되며 대신 지속되기 전에 서비스에 의해 계산됩니다. 그런 경우 setter 내부에서이 논리를 사용하는 것은 바람직하지 않습니다. setter가 호출되는 컨텍스트를 알아야하기 때문입니다. UI 레이어와 지속성 레이어에 다른 규칙을 적용해야합니다. JSR 303에서는 유효성 검사 그룹을 사용하여 이러한 우려를 분리 할 수 ​​있으므로 UI ​​유효성 검사 그룹이 지속성 유효성 검사 그룹과 다릅니다.

JPA 2.0, 당신은 JSR 303 검사기에 의해 평가되는 제약 조건을 사용하여 클래스에 주석을 때, 당신의 영속 공급자가 자동으로 PrePersist, PreUpdatePreRemove에 이러한 제약 (일반적으로하지, 아래 참조) 평가할 수에서

의 라이프 사이클 이벤트를 엔티티. JPA 공급자의 엔티티 유효성 검사를 수행하려면 파일에 validation-mode 요소 또는 javax.persistence.validation.mode 속성을 지정해야합니다. 값은 AUTO (기본값) 또는 CALLBACK (NONE 아님)이어야합니다.

기본값은 AUTO이므로 JPA 엔티티 라이프 사이클 이벤트에 대해 유효성 검증을 수행하기 위해서는 Bean 유효성 검증 제공자가 있어야 충분합니다. Java EE 6 응용 프로그램 서버에서이 값을 기본적으로 가져옵니다. Glassfish는 Hibernate Validator 인 JSR 303의 RI 구현을 사용하며 EclipseLink에서도 잘 작동합니다.

CALLBACK 모드에서는 라이프 사이클 이벤트가 트리거 될 때 적용 할 유효성 검사 그룹을 대체 할 수 있습니다. 기본적으로 기본 Bean 유효성 검사 그룹 (Default)은 업데이트 및 지속성 이벤트에 대해 유효성 검사가 수행됩니다. remove 이벤트에는 유효성 검사가 필요하지 않습니다. CALLBACK 모드에서는 javax.persistence.validation.group.pre-persist, javax.persistence.validation.group.pre-updatejavax.persistence.validation.group.pre-remove 속성을 사용하여 이러한 이벤트에 대해 다른 유효성 검사 그룹을 지정할 수 있습니다.

위에서 게시 한 Bean Validation API 문서 링크는 Java EE 6 API 설명서의 것이지만 JSR 303 유효성 검사는 Java EE 컨테이너 외부에서 사용할 수 있습니다.

+0

BTW, JSR 303의 참조 구현은 Hibernate Validator 프레임 워크입니다. 참조 : http://www.hibernate.org/subprojects/validator.html – MicSim

0

게터와 세터는 Jigar Joshi가 대답 한 것처럼 제한을 추가하는 데 좋습니다. 그렇게하면 피드백이 즉시 제공되고 문제가 발생할 때이를 처리 할 수 ​​있습니다.

다른 해결책은 객체 검증 (JSR-303 구현과 같은)을 사용하여 최소값 및 최대 값으로 필드에 주석을 달 수 있습니다.

@Min(value=1) 
private int myvalue; 

같은 뭔가 그럼 당신은 한 번에 전체 개체를 확인하고 다른 제약 필드가있는 경우 모든 메시지를 얻을 수 있습니다. 이것은 분명히 모든 곳에서 유용하지는 않지만 필요에 맞는 경우 선택 사항입니다.

마지막으로 "엔터티"라고 말하면 데이터베이스에 저장되어 있거나 ORM 도구와 관련된 것으로 생각됩니다. 그렇다면 getter에서하는 일과 조심해야합니다. 예를 들어 getter에서 게으른 초기화를 수행하면 일부 ORM 공급 업체가 해당 엔터티를 더티로 표시하고 데이터베이스에 플러시하려고 시도하여 의도하지 않은 쓰기가 발생할 수 있습니다.