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