2013-03-10 1 views
0

다음 문제가 있습니다. "역할"과 다 대다 관계가있는 "사용자"엔티티가 있습니다. 문제는 "역할"이 열거되고 (항상 5 개가 있으므로) 사용자를 가져올 때마다 가져 오는 것이므로 (거의 변경되지 않는 것처럼) 불필요한 것으로 여겨 질 때마다 가져 오는 것입니다. 나는 어떻게 든 기억을 유지하고 내가 그녀를 데리고 올 때마다 그 역할을 사용자에게 붙이고 싶습니다. hibernate는 2 레벨 캐시를 사용할 수 있으므로 필요한 경우이 기능을 사용할 수 있습니다. 누구에게도 해결책이 있습니까? 당신이 당신의 데이터 모델을 변경 테이블 역할을 삭제하고 사용자에게 외래 키와 간단한 대일 테이블로 다 대다 테이블을 변환 할 수 있습니다 경우 사전최대 절전 모드 및 캐시가있는 열거 형 값

+0

대답은 질문에 맞습니까? 아닙니다. 2 차 레벨 캐시를 사용하십시오. (5 행의 테이블에서 ID로 역할을 얻는 것이 이미 매우 빠르다는 점을 감안할 때 이것이 중요한 차이를 만들지는 모르겠다.) –

+0

또한 역할과 사용자 간의 연결을 캐시 할 수 있습니다. – benzonico

답변

0

에서

감사합니다 열 (varchar 또는 숫자로 역할을 들고 있지만 유지하기가 쉽기 때문에 varchar를 사용하는 것이 좋습니다). 당신이 역할 테이블을 삭제하지 않는 경우는 EnumType.ORDINAL 매핑을 사용하여 한 역할 아이디의 0 ~ 4이기 때문에이 작업을 수행하는 것이 가능하다는 것을

@Entity 
public class UserRole { 
    @ManyToOne 
    private User user; 
    @Column 
    @Enumerated(EnumType.STRING) // depends if column is varchar or number 
    private Role role; 
} 

public enum Role { ROLE1, ROLE2, ROLE3, ROLE4, ROLE5 } 

주의 사항 : 그럼 당신은 다음과 같은이 테이블을 매핑 할 수 있습니다 (기본값). 1에서 5이면 Role 열거 형 시작 부분에 모호한 역할을 추가하십시오.

+0

하지만 그것은 효과적으로 OneToMany 관계를 만들 것입니다. 그래서 항목은 ("User1", "Role1") ("User1", "Role2") ("User2", "Role1")처럼 보일 것입니다. – ShinySpiderdude

+0

물론이 요구 사항이 있으므로 단일 사용자에게 여러 역할을 할당하면 일대 다 관계를 피할 수 없습니다. 매번 캐싱하지 않도록 캐싱을 구성해야하지만이 솔루션을 사용하면 요청한 것처럼 보이는 역할을 모두 가져올 필요가 없습니다. –