2011-07-24 16 views
29

私は2つのクラスを持っています。 1つはエンティティクラス、もう1つは複合キークラスとして機能します。Hibernateの内部クラスのエンティティのデフォルトコンストラクタがありません

コードは次のとおりです。私はHibernateはつまり、例外がスローされます

from Supply where merchandise_id=%d and supplier_id=%d 

探してみてください使用している場合

@Entity 
public class Supply { 

    @Embeddable 
    class Id implements Serializable { 

     @Column(name = "supplier_id") 
     private long supplierId; 
     @Column(name = "merchandise_id") 
     private long merchandiseId; 

     public Id() { 
     } 

     public Id(long sId, long mId) { 
      this.supplierId = sId; 
      this.merchandiseId = mId; 
     } 
    } 

    @EmbeddedId 
    private Id id = new Id(); 
} 

は:

No default constructor for entity: com.entity.Supply$Id; nested exception is org.hibernate.InstantiationException: No default constructor for entity: com.entity.Supply$Id 

をしかし、私は私がクラスIDを変更する場合に見つかりましたスタティック。何もかも良くなるだろう。

私は、これらの事柄がどのように起こるのか不思議です。

+0

この投稿にハイバーネーションの警告ID "HHH000182"が含まれていると、多くの役に立ちます。静的なものは私のためのものを固定しましたが、この答えを見つけることは難しいでした! – Amalgovinus

答えて

41

- のでデフォルトは存在しませんコンストラクタ。 Idクラスがstaticある場合は、あなただけ呼び出すことができます

new Supply().new Id(); 

new Id(); 
0

クラスが静的でない場合、外部クラスインスタンスが存在する必要があります。だから、私は、このケースで生成されたコンストラクタは、外部クラスのための暗黙のパラメータを持つと思う。


更新

私が予想したように:クラスがstaticない場合は、インスタンス化するために、外部クラスのインスタンスが必要です

$ javap -classpath . Supply\$Id 
Compiled from "Supply.java" 
class Supply$Id extends java.lang.Object{ 
    final Supply this$0; 
    Supply$Id(Supply); 
} 
8

を、私はいつもこの問題を解決するためにクラスに空のprotectedコンストラクタを追加あなたはに似た構文を使用する必要があると思いますそのように:あなたのケースでは

protected Classname(){} 

それは次のようになります。

protected Id(){} 
関連する問題