繁体   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