首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >@MappedSuperclass和实现表

@MappedSuperclass和实现表
EN

Stack Overflow用户
提问于 2017-03-27 23:27:36
回答 1查看 1.7K关注 0票数 1

我继承了一些非常糟糕的代码,我希望通过重构来提高可重用性。有一组报告表,主要由3列组成:idreport_type_fkreport_description。为了便于使用,我想把所有的报告表合并成一个。

我正在重构代码,并认为最好将当前实体分解,以便Report是一个具有type实现的抽象类。例如,DmvReport extends ReportCreditScoreReport extends Report等。

我遇到的问题是,只有一个报告表需要保存到所有实体。是否有办法将abstract Report对象的所有具体实现保存到同一个表中?

下面是我继承的坏代码的一个例子

报告类

代码语言:javascript
复制
@Entity
@Table(name = "report")
public class Report<E extends Exception> {
    private long id;
    private ReportType type;
    private String description;
   ...
   ...
}

CreditReport类

代码语言:javascript
复制
@Entity
@Table(name = "credit_report")
public class CreditScore Report<E extends Exception> extends Report<E> {
    private long id;
    private ReportType type;
    private String description;
   ...
   ...
}

我想把它变成:

代码语言:javascript
复制
@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(){
      ...
   }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-09-28 20:05:25

我认为您应该使用@Inheritance而不是@MappedSuperClass。您的代码将如下所示:

代码语言:javascript
复制
@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(){
      ...
   }
}

此策略允许您将信用评分报告和DMV报表数据存储在一个表(report)中,但可以根据report_value_id字段实例化适当的实体。您不必在参数中定义report_value_id,因为它已经用于创建所需的实体。

这就是你要找的吗?

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43058105

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档