2017-03-27 7 views
0

저는 리팩터링을 사용하여 재사용 성을 높이기 위해 노력하고있는 멋진 코드를 물려 받았습니다. 주로 3 열 (id, report_type_fkreport_description)로 구성된보고 표 집합이 있습니다. 모든 보고서 테이블을 하나로 병합하여 사용하기 쉽도록하고 싶습니다.@MappedSuperclass 및 구현 테이블

코드를 리팩터링하고 Reporttype 구현의 추상 클래스가되도록 현재 엔터티를 중단하는 것이 더 좋을 것이라고 생각합니다. 예를 들어, DmvReport extends Report, CreditScoreReport extends Report

내가 겪고있는 문제는 모든 엔티티가 저장해야하는 보고서 테이블이 1 개 밖에 없다는 것입니다. abstract Report 개체의 모든 구체적인 구현을 동일한 테이블에 저장하는 방법이 있습니까? 여기

내가

을 상속 나쁜 코드의 예

보고서 클래스

@Entity 
@Table(name = "report") 
public class Report<E extends Exception> { 
    private long id; 
    private ReportType type; 
    private String description; 
    ... 
    ... 
} 

CreditReport 클래스

@Entity 
@Table(name = "credit_report") 
public class CreditScore Report<E extends Exception> extends Report<E> { 
    private long id; 
    private ReportType type; 
    private String description; 
    ... 
    ... 
} 

내가으로 바꿀 찾고 있어요 :

@MappedSuperclass 
@Table(name = "report") 
public abstract class Report<E extends Exception> { 
    @Id @Column(name="id") 
    private long id; 

    @OneToOne(fetch = FetchType.EAGER) 
    @JoinColumn(name = "report_type_id") 
    private ReportType type; 

    @column(name="description") 
    private String description; 
    ... 
    ... 
} 

@Entity 
@Table(name = "report") 
public class CreditScoreReport<E extends Exception> extends Report<E> { 

    public void doCreditScoreStuff(){ 
     ... 
    } 
} 

@Entity 
@Table(name = "report") 
public class DmvReport<E extends Exception> extends Report<E> { 
    public void doDmvStuff(){ 
     ... 
    } 
} 
+0

이미이 문제를 해결해야하는 [this] (http://stackoverflow.com/questions/5257921/hibernate-how-override-an-attribute-from-mapped-super-class/5258090#5258090)을 확인하십시오. 문제. –

+0

@AlexanderBischof - 여러 개의 구체적인 구현이 동일한 테이블에 저장되는 예는 표시되지 않습니다. – Dan

답변

0

나는 y라고 생각한다. ou는 @MappedSuperClass 대신 @Inheritance을 사용해야합니다.

@Entity 
@Table(name = "report") 
@Inheritance(strategy = InheritanceType.SINGLE_TABLE) 
@DiscriminatorColumn(name = "report_type_id", discriminatorType = DiscriminatorType.INTEGER) 
public abstract class Report<E extends Exception> { 
    @Id @Column(name="id") 
    private long id; 

    @column(name="description") 
    private String description; 
    ... 
    ... 
} 

@Entity(name = "CreditScoreReport") 
@DiscriminatorValue("1") // the id corresponding to the credit score report 
public class CreditScoreReport<E extends Exception> extends Report<E> { 

    @Column(name = "specific_credit_score_report_1) 
    private Integer specificCreditScoreReport1; 

    public void doCreditScoreStuff(){ 
     ... 
    } 
} 

@Entity(name = "DmvReport") 
@DiscriminatorValue("2") // the id corresponding to the DMV report 
public class DmvReport<E extends Exception> extends Report<E> { 

    @Column(name = "specific_dmv_score_report_1) 
    private Integer specificDmvScoreReport1; 

    public void doDmvStuff(){ 
     ... 
    } 
} 

이 전략은 당신이 하나 개의 테이블 (report)에 신용 점수 보고서 및 DMV 보고서 데이터를 저장할 수 있지만, report_value_id 필드에 따라 적절한 엔티티를 실체화 : 코드는 다음과 같을 것이다. 필수 엔터티를 만드는 데 이미 사용되었으므로 매개 변수에 report_value_id을 정의 할 필요가 없습니다.

이게 당신이 찾고 있는게 있나요?