2012-09-10 3 views
1

Word 및 상태 테이블 2 개가 있습니다. 상태에는 2 열, ID 및 CurrentState가 포함되어 있으며 정적 행 3 개가 활성 1, 활성 2, 비활성 3, 기타가 있습니다 Word는 table 행을 추가 할 테이블입니다. 그것에는 4 cols, ID, Value, Description 및 CurrentState가 있습니다. 그것은 컬럼에 상태에 외래 키가 있습니다 currentState 여기는 Word를 만들고, currentState 필드를 설정하고 그것을 지속하는 작업 코드입니다.외래 키 필드 작업을위한 모범 사례

Word word = new Word(); 
word.setValue("someWord"); 
word.setDescription("some description for this word");  
State state = new State(1,"Active"); 
word.setState(state); 
worddao.saveOrUpdate(word); 

이 것은 올바르게 보이지 않습니다. 유효한 State 행을 가리키는 Word를 만들 수 있도록 State 인스턴스를 만드는 가장 좋은 방법은 무엇입니까? Enumeration은 여기에 옵션이 있습니까? 나는 실수로 ID가 5 인 상태를 만들고 외래 키 제약을 위반할 수 있음을 의미합니다. 나는 이것이 처음부터 일어나는 것을 막고 싶다. 어떤 아이디어?

+1

예 열거 옵션입니다! 이것 참조 http://stackoverflow.com/questions/417062/enumerations-in-hibernate – bpgergo

+0

enums 좋은 옵션입니다 -하지만 더 많은 노력을 새로운 가치를 추가 할 수 있습니다. 다른 값에 대한 조건부 코드가 이미있는 경우 문제가되지 않습니다. – gkamal

답변

1

이 작업을 수행하는 안전한 방법은 새 개체를 만드는 대신 상태 개체를 찾는 것입니다. 엔티티를 캐시 가능으로 표시하고 불필요한 쿼리를 피하기 위해 상태를 캐시 가능으로 검색하도록 쿼리를 표시 할 수 있습니다.

Word word = new Word(); 
word.setValue("someWord"); 
word.setDescription("some description for this word");  
State state = stateDao.findByState("Active") 
word.setState(state); 
worddao.saveOrUpdate(word); 

마스터/참조 데이터 테이블에 대한 다른 옵션은 숫자 ID가 없어야합니다. 그것의 문자열 표현 인 하나의 컬럼을 가지고 그것을 외래 키 컬럼으로 사용하십시오.

이점은 데이터베이스의 데이터 (워드 테이블)를 볼 때 상태를 쉽게 해석 할 수 있다는 것입니다. 데이터를 이해하기 위해 정신 분석을 한 번 더 할 필요가 없습니다.

다른 이점은 캐싱이 쉬워진다는 것입니다. 조회는 항상 기본 키로 수행되기 때문에 조회가 아닌 엔티티를 캐시해야합니다.

나중에 필요한 경우 표시 레이블 인 다른 열을 추가 할 수 있습니다.

+0

건배, 이것은 제가 얻은 것입니다. 불필요한 쿼리를 초래할 유효한 상태 값의 목록을 얻기 위해 데이터베이스를 매번 쿼리하면 걱정됩니다. 테이블 캐싱은 내가 필요한 것처럼 들리지만, 건배 – MayoMan