簡體   English   中英

如何在Hibernate中從非實體子類中持久化實體

[英]How to persist an entity from an non-entity subclass in Hibernate

我試圖將實體擴展為非實體,用於填充超類的字段。 問題是,當我嘗試保存它時,Hibernate會拋出MappingException。 這是因為即使我將ReportParser強制轉換為Report,運行時實例仍然是ReportParser,因此Hibernate抱怨它是一個未知實體。

@Entity
@Table(name = "TB_Reports")
public class Report
{
   Long id;
   String name;
   String value;

   @Id
   @GeneratedValue
   @Column(name = "cReportID")
   public Long getId()
   {
      return this.id;
   }

   public void setId(Long id)
   {
      this.id = id;
   }

   @Column(name = "cCompanyName")
   public String getname()
   {
      return this.name;
   }

   public void setName(String name)
   {
      this.name = name;
   }

   @Column(name = "cCompanyValue")
   public String getValue()
   {
      return this.name;
   }

   public void setValue(String value)
   {
      this.value = value;
   }
}

ReportParser僅用於填寫字段。

public class ReportParser extends report
{
   public void setName(String htmlstring)
   {
      ...
   }

   public void setValue(String htmlstring)
   {
      ...
   }
}

嘗試將其轉換為報告並保存

...
ReportParser rp = new ReportParser();
rp.setName(unparsed_string);
rp.setValue(unparsed_string);
Report r = (Report)rp;
this.dao.saveReport(r);

我在移動到ORM之前使用過這種模式,但是我無法弄清楚如何使用Hibernate。 可能嗎?

是否絕對有必要對實體進行子類化? 您可以使用構建器模式:

public class ReportBuilder {
    private Report report;
    public ReportBuilder() {
        this.report = new Report();
    }
    public ReportBuilder setName(String unparsedString) {
        // do the parsing
        report.setName(parsedString);
        return this;
    }
    public ReportBuilder setValue(String unparsedString) {
        // do the parsing
        report.setValue(parsedString);
        return this;
    }
    public Report build() {
        return report;
    }
}

Report report = new ReportBuilder()
                   .setName(unparsedString)
                   .setValue(unparsedString)
                   .build();
dao.saveReport(report);

除非要生成更專業的實體類,否則不應該擴展實體類。 與實體相關的注釋保留在子類中,因此Hibernate會混淆。

將業務邏輯放在實體類中也是值得商榷的 - 你必須要知道JPA實現者,比如Hibernate,可能(並且通常會)通過生成的代理來運行你的getter / setter。 由於內部邏輯復雜,您可能會遇到難以追蹤的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM