2012-12-19 5 views
2

Hibernate는 엔티티에서 정적 속성과 동적 속성의 조합을 지원하는지 궁금합니다. 예를 들어,Hibernate는 런타임시 엔티티 모드를 혼합 할 수 있습니까?

public class User 
{ 
    private Long id; 
    private String first_name; 
    private String last_name; 
    private Map<String,Object> dynamicProperties; 
} 

런타임시 Db에서 User 테이블의 메타 데이터를 읽어 동적 속성을 얻을 수 있습니다. 기본적으로 저는 여러 클라이언트를 지원하는 제품을 개발 중입니다.

하나의 클라이언트에 대한 사용자 테이블은 다른 클라이언트 사용자 테이블 반면 last_nameDOBTitle처럼이 또한 열을 저장해야, id, first_name처럼 열을 가질 수 있습니다. 모든 클라이언트들 id, first_name와 속성의 last_name 같은 일반적인 설정을 고려

나는 그 정적 속성을 사용하여 내가 엔티티의 맵으로 저장하기 위해 계획하고 휴식을하고있다. 최대 절전 모드로 죽을 지 확신 할 수 없으므로이를 지원합니다.

코드는 런타임시 동적 속성 열에 대해 코드가 알고 있다는 제약이 있습니다.

답변

0

여러분의 매핑 전략을 살펴볼 필요가 있다고 생각합니다. 최대 절전 모드에서는 스키마를 정적으로 유지해야합니다. 나는 dynamicProperties의 이름을 metaData로 변경하고 맵에 문자열 키와 문자열 값을 포함시키고 하이버 네이트 맵핑 파일에 매핑 된 프로퍼티로 포함시킬 것을 제안합니다. 매핑 된 하이버 네이트에서 일반 객체 값의 맵을 갖는 것이 의미가 없다. 다른 대안은 그 맵을 @transient로 표시하는 것이지만, 첫 번째 제안이 더 합리적이라고 생각합니다. 클라이언트 특정 메타 데이터를 원하므로 스키마의 일부로 매핑하십시오.

+0

이 질문은 내가 이해하지 못했던 부분입니다. "제약 조건은 런타임시 동적 속성 열에 대해서만 알고 있습니다."라는 일시적인 속성처럼 보이는 이유는 그 제한이 필요한 이유를 알지 못합니다. –

+0

감사합니다. Duncan. 내 질문에 대해 좀 더 자세히 설명해 드리겠습니다. 저는 여러 조직을 클라이언트로 지원하는 제품을 개발하고 있습니다. 한 조직의 직원 정의는 id, firstName, lastName과 같은 3 개의 필드를 가질 수 있지만 다른 조직의 경우 id, firstName, lastName, 생년월일, 인사말 등과 같은 5 개의 필드를 가질 수 있습니다. 이러한 변형을 지원하기 위해 나는 DynamicProperties라는 맵에 저장된 Object 및 Client 특정 속성의 속성으로 Employee의 공통 속성을 사용하고 있습니다. 기본적으로 새로운 클라이언트가 들어올 때마다 db의 메타 데이터를 읽습니다. – user1914503

+0

"metadata from db"에 대해 더 자세히 설명하십시오. 모든 클라이언트에 대해 하나의 스키마 만 고수하고 있습니까? 런타임시 캐스팅 할 수있는 데이터 유형에 대한 ID 및 문자열 값 및 상수를 갖는 CustomProperty와 같은 객체는 어떻습니까? 그런 다음 해당 메타 데이터에 대한 사용자 지정 쿼리 메서드를 작성할 수 있다고 가정합니다. 그러나 각 클라이언트에는 동일한 스키마 권한이 있습니까? –

0

제가 여기서 일하고있는 프로젝트는 정확하게 (동적 인, 클라이언트 별 모델) 않습니다. 그러나 동일한 행에 정적 (클래스 기반) 및 동적 엔터티를 섞어서는 안됩니다. 모델의 정적 부분을 동적 부분과 분리하고 클래스로 정적을 매핑하고 동적 부분을 EntityMode.MAP entites로 매핑하여 원하는 것을 쉽게 할 수 있습니다. EntityMode.MAP에서 JPA 조건 쿼리를 사용할 수있는 patch for Hibernate 4.1을 제출했습니다. 따라서 동적 쿼리 생성이 훨씬 간단 해집니다.

관련 문제