Как сохранить сущность из подкласса не-сущности в Hibernate - PullRequest
7 голосов
/ 19 сентября 2011

Я пытаюсь расширить сущность в не-сущность, которая используется для заполнения полей суперкласса.Проблема в том, что при попытке сохранить 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.,Возможно ли это?

Ответы [ 2 ]

3 голосов
/ 19 сентября 2011

Есть ли необходимость в создании подкласса сущности? Вы можете использовать шаблон строителя:

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);
0 голосов
/ 19 сентября 2011

Вы не должны расширять классы сущностей, если только вы не создаете более специализированные классы сущностей. Связанные с сущностью аннотации сохраняются в подклассе, поэтому Hibernate запутывается.

Ввод бизнес-логики в классах сущностей также весьма спорно и mdash; Вы должны знать, что разработчики JPA, такие как Hibernate, могут (и обычно делают) запускать ваши методы получения / установки через сгенерированные прокси. Со сложной логикой внутри вы можете столкнуться с проблемами, которые трудно отследить.

...