2014-11-27 1 views
1

파일 입력에서 디코딩 된 데이터를 유지하기 위해 최대 절전 모드를 사용하고 있습니다. 우리의 형식 중 하나가 가변 길이 형식이기 때문에 트랜잭션이 커밋되기 전에 엔티티에서 가능한 삽입 오류를 쉽게 확인하고 싶습니다. 따라서 예외를 처리하고 적절한 조치를 취할 수 있습니다.미리 문자열 겹침 길이를 감지합니다.

나는 내가 각 열의 값으로 설정 String은 길이와 호환되는지 감지하고 싶습니다

@Entity 
public class Entity { 

    @Column(...,length=20) 
    private String col1; 

    @Column(...,length=20) 
    private String col2; 

    @Column(...,length=40) 
    private String col3; 

    ... 

    @Column(...,length=100) 
    private String col..N; 

} 

엔티티가있는 경우, 가능성에 대해 각각의 모든 필드의 유효성을 검사하는 자바 코드를 인스트루먼트없이 최대 길이

현재 하나의 레코드 만 문제의 영향을받을 때 전체 일괄 처리에 대해 트랜잭션이 커밋 될 때 (예 : @Transactional 메서드가 반환 됨) SQL 예외가 발생합니다. 내가 Session.persist(entity) 일 때 예외를 잡을 수 있습니다.

아이디어가 있으십니까? 여기에 제안

답변

4

이미 최대 절전 모드를 사용하기 때문에 , 당신은 Hibernate Validator을 고려 했습니까? 그것은 당신이 @Column 옆에 주석의 또 다른 세트를 사용해야 할 것입니다이

@Size(max = 20) 
@Column(...,length=20) 
private String col1; 

// and validation itself 
ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); 
validator = factory.getValidator(); 
Set<ConstraintViolation<Entity>> constraintViolations = validator.validate(entity); 

단점처럼 보일 것이지만, 다른 한편으로는 더 많은 옵션을 제공합니다.

또 다른 옵션은 aspects을 사용하고 @Entity으로 주석 된 클래스의 String 필드에 대한 모든 설정 도구를 차단하는 것입니다. 이 측면에서는 @Column 주석을 가져오고 구성된 lenght 주석이있는 매개 변수 길이를 주석과 비교합니다.

+0

유효성 검사에 실패하면 CallbackException을 throw해야하는 Lifecycle.onSave 메서드에서 유효성 검사를 성공적으로 수행 할 수 있습니다. –

0

당신은 문자열을 잘라내려면 사용자 정의 인터셉터를 사용할 수 있습니다 Properly handling long data in Hibernate

아니면을 길이 주석 및 사용자 정의 길이 유효성 검사기를 사용하여 여기 제안 : hibernate validator LengthValidator of truncated string

+0

실제로 저는 잘라 내기보다는 예외를 throw해야합니다. 이렇게하면 사용자에게 상황에 대한 정보를 알릴 수 있습니다. –

관련 문제