【问题标题】:No default constructor for entity for inner class in HibernateHibernate中内部类的实体没有默认构造函数
【发布时间】:2011-07-24 05:41:26
【问题描述】:

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

代码如下。

@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

但是,我发现如果我将 class Id 更改为 static。一切都会好起来的。

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

【问题讨论】:

  • 如果您在此帖子中包含休眠警告 ID“HHH000182”,将会有很大帮助。静态的东西为我解决了问题,但很难找到这个答案!

标签: java hibernate composite-key


【解决方案1】:

如果类不是static,它需要一个外部类的实例才能被实例化——所以不会有默认构造函数。您必须使用类似于以下的语法:

new Supply().new Id();

如果Id 类是static,你可以调用:

new Id();

【讨论】:

    【解决方案2】:

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

    protected Classname(){}
    

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

    protected Id(){}
    

    【讨论】:

    • 这如何解决问题?你仍然需要一个静态类。
    【解决方案3】:

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


    更新

    正如我所料:

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

    【讨论】:

      猜你喜欢
      • 2015-03-19
      • 1970-01-01
      • 2017-10-20
      • 2018-01-10
      • 1970-01-01
      • 2020-02-07
      • 2014-10-16
      • 2022-01-01
      相关资源
      最近更新 更多