2011-08-04 12 views
0

DiscriminatorColumnを使用して抽象エンティティを持ち、さまざまなエンティティによってサブクラス化されています。今、抽象クラスで名前付きクエリをクエリすると、 'org.hibernate.InstantiationException抽象クラスまたはインタフェースをインスタンス化できません'というエラーがスローされます。分析では、生成されたネイティブSQL自体にディスクリミネータ列が追加されていないことがわかりました。エンティティマッピングの簡易版を以下に示します。Hibernate JPA Discriminatorカラムが生成されたクエリに追加されない

package com.qz.test; 

import javax.persistence.*; 

/** 
* User: r4rao 
* Date: 7/18/11 
* Time: 5:36 PM 
*/ 
@Entity 
@Table(schema = "ems", name = "nlt_content_profile") 
@Inheritance(strategy = InheritanceType.SINGLE_TABLE) 
@DiscriminatorColumn(name = "content_profile_type", discriminatorType = DiscriminatorType.STRING) 
@NamedQueries({ 
     @NamedQuery(name = "A.getProfilesForDelivery", query = "select pcp from A pcp where pcp.serviceId = :service_id ") 
//  @NamedQuery(name = "A.getProfilesByIdsForDelivery", query = "select pcp,s from A pcp,Subscription s LEFT JOIN FETCH s.client c LEFT JOIN FETCH c.operator where pcp.id in (:cp_ids) and pcp.service.id = :service_id and s.contentProfile.id = pcp.id and s.status in (:statuses) and (:use_timestamp = false or (:use_timestamp = true and s.beginningTime < :timestamp)))"), 
//  @NamedQuery(name = "A.removeUnusedContentProfiles", query = "DELETE FROM A pcp WHERE NOT EXISTS(SELECT 1 FROM Subscription sub WHERE sub.contentProfile.id = pcp.id)"), 
//  @NamedQuery(name = "A.getProfileIdsForDelivery", query = "select pcp.id from A pcp where pcp.service.id = :service_id and exists(select 1 from Subscription s where s.contentProfile.id = pcp.id and s.status in (:statuses))") 
}) 
public abstract class A{ 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO, generator = "ContentProfileSeq") 
    @SequenceGenerator(name = "ContentProfileSeq", sequenceName = "ems.nlt_content_profile_seq") 
    private Long id; 

    public Long getId() { 
     return id; 
    } 

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


    @Column(name = "service_id") 
    private Long serviceId; 

    public Long getServiceId() { 
     return serviceId; 
    } 

    public void setServiceId(Long serviceId) { 
     this.serviceId = serviceId; 
    } 
} 

package com.qz.test; 

import javax.persistence.*; 

/** 
* User: r4rao 
* Date: 7/18/11 
* Time: 5:36 PM 
*/ 
@Entity 
public class B extends A { 
    @Column(name = "subscription_parameter") 
    private String param; 

    @Override 
    public String toString() { 
     final StringBuilder sb = new StringBuilder(); 
     sb.append("B"); 
     sb.append("{param='").append(param).append('\''); 
     sb.append('}'); 
     return sb.toString(); 
    } 
} 

答えて

1

設定ミスが原因であることがわかりました。具体的なサブクラスの構成が欠落していたときに抽象クラスのみがpersistence.xmlに構成されました。具体的なクラスの設定を追加すると、このエラーは解決されました。

驚いたことに、適切なエラーをスローするのではなく、生成されたクエリでdiscriminatorカラムを使用してフィルタ句を追加していませんでした。

0

あなたの名前付きクエリは、「私に与えられた基準に一致するすべてのAのインスタンスとそのサブクラスを与える」を意味しAから選択します。とにかくすべての値を探しているので、Hibernateがdiscriminatorカラムでフィルタリングする理由はありません。

このエラーは、基礎となるデータベーステーブルの不正なデータが原因で発生している可能性があります。識別子の列の値が 'A'を指しているレコードがあります。 Hibernateはそれらを保持するためにAクラスをインスタンス化しようとします(抽象的であるため)ことができず、エラーを投げます。

関連する問題