休眠中内部类的实体没有默认构造函数

2022-09-01 06:47:03

我有两个班级。一个是实体类,另一个是复合键类。

代码如下。

@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

休眠会引发异常,即:

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更改为静态。一切都会好起来的。

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


答案 1

如果该类不是 ,它需要外部类的实例才能实例化 - 因此不会有默认构造函数。您必须使用类似于以下内容的语法:static

new Supply().new Id();

如果该类是 ,则只需调用:Idstatic

new Id();

答案 2

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

protected Classname(){}

在你的情况下,它看起来像这样:

protected Id(){}

推荐