簡體   English   中英

Hibernate中內部類的實體沒有默認構造函數

[英]No default constructor for entity for inner class in Hibernate

我有兩節課。 一個是實體類,另一個是復合鍵類。

代碼如下。

@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

但是,我發現如果我將 ID更改為靜態 一切都會好起來的。

我只是好奇所有這些東西是如何發生的。

如果類不是static ,則需要外部類的實例才能實例化 - 因此不會有默認的構造函數。 你必須使用類似於的語法:

new Supply().new Id();

如果Id類是static ,您只需調用:

new Id();

我總是在類中添加一個空的受保護構造函數來解決這個問題,如下所示:

protected Classname(){}

在你的情況下,它看起來像這樣:

protected Id(){}

如果class是非靜態的,則需要外部類實例存在。 所以,我認為,在這種情況下生成的構造函數將具有外部類的隱式參數。


更新

正如我所料:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM