Java Hibernate中内部类的实体没有默认构造函数

Java Hibernate中内部类的实体没有默认构造函数,java,hibernate,composite-key,Java,Hibernate,Composite Key,我有两节课。一个是实体类,另一个用作复合键类 代码如下 @Entity public class Supply { @Embeddable class Id implements Serializable { @Column(name = "supplier_id") private long supplierId; @Column(name = "merchandise_id") private long me

我有两节课。一个是实体类,另一个用作复合键类

代码如下

@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。一切都会好的


我只是好奇所有这些事情是如何发生的。

如果类是非静态的,它将需要外部类实例存在。所以,我认为,在这种情况下,生成的构造函数将具有外部类的隐式参数


更新

正如我所料:

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

如果类不是静态的,它需要外部类的一个实例才能被实例化,因此没有默认的构造函数。您必须使用与以下类似的语法:

new Supply().new Id();
如果
Id
类是
static
,您可以调用:

new Id();

我总是向类中添加一个空的受保护构造函数来解决此问题,如下所示:

protected Classname(){}
在您的情况下,它将如下所示:

protected Id(){}

如果你在这篇文章中包含hibernate警告ID“HH000182”,那会有很大帮助。静态的东西为我解决了问题,但是找到这个答案很难!这是如何解决问题的?您仍然需要有一个静态类。