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
ただし、classIdをstaticに変更すると、何もかも良くなるだろう。
私はこれらすべてがどのように発生するかについて興味があります。
クラスがstatic
ではない場合、インスタンス化するには外部クラスのインスタンスが必要です-したがって、デフォルトのコンストラクターはありません。次のような構文を使用する必要があります。
new Supply().new Id();
Id
クラスがstatic
の場合、次のように呼び出すだけです。
new Id();
次のようにこの問題を解決するために、常に空の保護されたコンストラクターをクラスに追加します。
protected Classname(){}
あなたの場合は次のようになります:
protected Id(){}
クラスが静的でない場合、外部クラスインスタンスが存在する必要があります。したがって、この場合に生成されるコンストラクターには、外部クラスの暗黙的なパラメーターがあると思います。
更新
私の期待通りに:
$ javap -classpath . Supply\$Id
Compiled from "Supply.Java"
class Supply$Id extends Java.lang.Object{
final Supply this$0;
Supply$Id(Supply);
}