我有两节课。一个是实体类,另一个是复合键类。
代码如下。
@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 更改为静态。一切都会好的。
我很好奇所有这些事情是如何发生的。
答案 0 :(得分:43)
如果类不是static
,则需要外部类的实例才能实例化 - 因此不会有默认构造函数。您必须使用类似于以下语法:
new Supply().new Id();
如果Id
班级为static
,您只需致电:
new Id();
答案 1 :(得分:9)
我总是在类中添加一个空的受保护构造函数来解决这个问题:
protected Classname(){}
在你的情况下,它看起来像这样:
protected Id(){}
答案 2 :(得分:0)
如果class是非静态的,则需要外部类实例存在。所以,我认为,在这种情况下生成的构造函数将具有外部类的隐式参数。
更新
正如我所料:
$ javap -classpath . Supply\$Id
Compiled from "Supply.java"
class Supply$Id extends java.lang.Object{
final Supply this$0;
Supply$Id(Supply);
}