2011-09-19 8 views
7

スーパークラスのフィールドを埋めるために使用される非エンティティにエンティティを拡張しようとしています。問題は、それを保存しようとすると、HibernateがMappingExceptionをスローするということです。これは、ReportParserをReportにキャストしても、実行時インスタンスはReportParserなので、Hibernateは未知のエンティティであると不満を持ちます。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でこれを行う方法を見つけ出すことはできません。出来ますか?

答えて

3

エンティティをサブクラス化することは絶対に必要ですか?

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

これはエンティティをサブクラス化するよりも優れたアプローチです。ありがとう! – vopilif

0

特殊なエンティティクラスを作成しない限り、エンティティクラスを拡張することはできません。エンティティ関連のアノテーションはサブクラスに保持されるため、Hibernateは混乱します。

エンティティクラスにビジネスロジックを置くことも非常に議論の的です。— HibernateのようなJPA実装者は、生成されたプロキシを介してgetter/setterを実行する可能性があります。複雑なロジックを使用すると、トレースするのが困難な問題が発生する可能性があります。

+0

Hibernateは、あなたが指示しない限り、生成されたプロキシを通してあなたのコードを実行しません。回避すべきものは、ビジネスロジックではなく、適切に構造化されたアプリケーションの他の場所に属するビジネスロジックです。 – Jay

関連する問題