2014-09-05 2 views
0

내 "테이블 당 콘크리트 클래스"주위에 접근 내 Java에서 나는 추상적 인 또는 비 추상적 인 어느 쪽의 방법이 될 수 있지만 데이터베이스의 테이블에 매핑되지 않습니다. 모든 클래스에 공통적 인 하나 이상의 변수가 있습니다. 예 :최대 절전 모드 상속 매핑 전략

public class GenericThing { 
    private Date createDate; 
    public Date getCreateDate() { 
     return createDate; 
    } 
    public void setCreateDate(Date dt) { 
     createDate = dt; 
    } 
} 

문자 그대로 데이터베이스의 모든 테이블에 CREATE_DATE 열이 있기 때문에 유용합니다.

Hibernate에서 사용할 올바른 상속 전략은 "concrete per table"입니다. 그러나 이것은 각각의 테이블에 동일한 열이 필요하고 해당 열 이름 (CREATE_DATE)을 변경하면 모든 테이블의 열 이름을 변경해야하기 때문에 이것은 "나쁘다"고 말합니다. 글쎄, 분명히 이것은 사실이지만 대안은 무엇입니까? 분명히 데이터베이스의 모든 테이블에 Create Date를 저장하고 싶지만 전체 데이터베이스의 모든 개체가 하나의 테이블에 있어야하므로 모든 다른 매핑 전략을 올바르게 수행 할 수 없습니다. ?

답변

0

무엇이 잘못 되었나요? table pet subclass 다형성? 부모 테이블에는 commom 열이 있고 자식 테이블에는 특성이 들어 있습니다. 당신의 유스 케이스에 대한 사실

+0

하위 클래스 당 표는 상위 클래스가 데이터베이스에 있다고 가정하는 것 같습니다. 하지만 내 예제에서 볼 수 있듯이 부모 클래스는 실제 db 객체가 아닙니다. 이것은 모든 구체적인 클래스에 공통적 인 두 개의 필드를 포함하는 추상 클래스입니다. 특정 테이블에 맵핑되지 않습니다. – pete

+0

데이터베이스의 구조를 변경하여 테이블의 부모 클래스를 유지할 수 있다고 가정합니다. 하지만 우리가 만든 모든 항목의 생성 날짜에 액세스하려고 할 때마다 내부 참여가 필요하지 않습니까? – pete

+0

이제 나를 혼란스럽게합니다. 각 테이블에서 동일한 열을 반복하지 않으려면 동일한 테이블에서 전체 계층 구조를 보유하고 싶지 않고 공통 열을 별도로 유지하고 조인을 수행하지 않으려면 어떻게해야합니까? 정확히 무엇을 기대합니까? 어쨌든 https://docs.jboss.org/hibernate/orm/3.3/reference/en/html/inheritance.html을 읽고 옵션을 선택하십시오. – kaqqao

1

, Table per concrete class 전략

당신은 (테이블이 생성됩니다) 스키마 수준에서 모든 중복을 생성하지 않습니다 해결하려고하는 문제를 사용하여 잘못 아무것도. 우리가 엔티티 모델링을 역방향 모드로 수행하더라도 이것이 문제가되지 않습니다. 사실, create_date는 모든 테이블마다 각 행마다 다릅니다.

Table per concrete class은 사용자 -> 고객 -> 공급 업체 (예 : 각 확장 클래스가 일종의 상위 클래스이고 하위 클래스에 추가 된 특정 추가 속성이 해당 하위 클래스에 중복 될 필요는 없음)와 같이 일반적인 상속을 처리하는 경우에만 권장됩니다. 모든 테이블 (조인 테이블 전략은 이러한 경우에 권장 됨)