web-dev-qa-db-ja.com

Hibernateの内部クラスのエンティティのデフォルトコンストラクターはありません

2つのクラスがあります。 1つはエンティティークラスで、もう1つは複合キークラスとして機能します。

コードは以下の通りです。

@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();
}

私が見つけようとするなら

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

Hibernateは例外をスローします。

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

ただし、classIdstaticに変更すると、何もかも良くなるだろう。

私はこれらすべてがどのように発生するかについて興味があります。

33
xiaohan2012

クラスがstaticではない場合、インスタンス化するには外部クラスのインスタンスが必要です-したがって、デフォルトのコンストラクターはありません。次のような構文を使用する必要があります。

new Supply().new Id();

Idクラスがstaticの場合、次のように呼び出すだけです。

new Id();
44
Bohemian

次のようにこの問題を解決するために、常に空の保護されたコンストラクターをクラスに追加します。

protected Classname(){}

あなたの場合は次のようになります:

protected Id(){}
9
Ben

クラスが静的でない場合、外部クラスインスタンスが存在する必要があります。したがって、この場合に生成されるコンストラクターには、外部クラスの暗黙的なパラメーターがあると思います。


更新

私の期待通りに:

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