Нет конструктора по умолчанию для объекта внутреннего класса в 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();
}

Если я использую try to find

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 to статический. Все будет хорошо.

мне просто интересно, как все эти вещи могут случаться.

3 ответов


если класс не static, для создания экземпляра требуется экземпляр внешнего класса , поэтому конструктора по умолчанию не будет. Вы должны использовать следующий синтаксис:

new Supply().new Id();

если Id класс static, вы можете просто звоните:

new Id();

Я всегда добавляю пустой защищенный конструктор в класс, чтобы решить эту проблему следующим образом:

protected Classname(){}

в вашем случае это будет выглядеть так:

protected Id(){}

Если класс нестатичен, для его существования потребуется внешний экземпляр класса. Поэтому, я думаю, сгенерированный конструктор в этом случае будет иметь неявный параметр для внешнего класса.


обновление

Как я и ожидал:

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