2011-07-24 24 views
29

我有两个类。一个是实体类,另一个是复合键类。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 

然而,我发现,如果我改变标识static。一切都会好起来的。

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

+0

如果在本贴中包含休眠警告ID“HHH000182”,它将有很大帮助。静态的东西为我固定的东西,但找到这个答案很难! – Amalgovinus

回答

41

如果该类不是static,它需要以外部类的实例进行实例化 - 所以会有没有默认构造函数。你不得不使用类似的语法:

new Supply().new Id(); 

如果Id类是static,你可以叫:

new Id(); 
0

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


更新

如我所料:

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

我总是空的受保护的构造添加到类来解决这个问题像这样:

protected Classname(){} 

在你的情况是这样的:

protected Id(){} 
相关问题