2011-09-19 12 views
7

Estoy tratando de extender una entidad a una entidad que no se utiliza para llenar los campos de la superclase. El problema es que cuando intento guardarlo, Hibernate arroja una MappingException. Esto se debe a que aunque eché ReportParser a Report, la instancia de tiempo de ejecución sigue siendo un ReportParser, por lo que Hibernate se queja de que es una entidad desconocida.Cómo persistir una entidad desde una subclase no-entidad en 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 se utiliza para completar campos.

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

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

intento de echarlo a un informe y guardarlo

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

he utilizado este patrón antes de mudarme a un ORM, pero no puedo encontrar la manera de hacer esto con Hibernate . ¿Es posible?

Respuesta

3

¿Es absolutamente necesario para crear una subclase de la entidad? Se podría utilizar el Builder:

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

Esto parece un mejor enfoque que la subclasificación de la entidad. ¡Gracias! – vopilif

0

No se supone extender las clases de entidad, a menos que para hacer clases de entidades más especializadas. Las anotaciones relacionadas con la entidad se retienen en la subclase, por lo que Hibernate se confunde.

Poner lógica de negocio en clases de entidad también es muy discutible — debe tener en cuenta que los implementadores de JPA, como Hibernate, pueden (y normalmente lo hacen) ejecutar sus getters/setters a través de proxies generados. Con una lógica complicada en su interior, puede encontrarse con problemas que son difíciles de rastrear.

+0

Hibernate no ejecuta su código a través de ningún proxy generado a menos que se lo indique. Lo que se debe evitar no es la lógica comercial, sino la lógica comercial que pertenece a otra parte en una aplicación debidamente estructurada. – Jay

Cuestiones relacionadas