2011-07-24 7 views
29

Tengo dos clases. Una es la clase de entidad, la otra sirve como una clase de clave compuesta.Ningún constructor predeterminado para entidad para clase interna en Hibernate

El código es el siguiente.

@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(); 
} 

Si utilizo tratar de encontrar

from Supply where merchandise_id=%d and supplier_id=%d 

Hibernate lanzará una excepción, a saber:

No default constructor for entity: com.entity.Supply$Id; nested exception is org.hibernate.InstantiationException: No default constructor for entity: com.entity.Supply$Id 

Sin embargo, he encontrado que si cambio claseId a estática. Todo estará bien.

Tengo curiosidad acerca de cómo pueden suceder todas estas cosas.

+0

Ayudaría mucho si incluye el ID de advertencia de hibernación "HHH000182" en esta publicación. Lo estático me solucionó las cosas, ¡pero encontrar esta respuesta fue difícil! – Amalgovinus

Respuesta

41

Si la clase no es static, se requiere una instancia de la clase externa con el fin de crear una instancia - por lo que no habrá ningún defecto constructor. Habría que utilizar una sintaxis similar a:

new Supply().new Id(); 

Si la clase es Idstatic, sólo puede llamar a:

new Id(); 
0

Si la clase no es estática, requerirá que exista una instancia de clase externa. Entonces, creo que el constructor generado en este caso tendrá un parámetro implícito para la clase externa.


actualización

Como esperaba:

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

siempre añado una constructora protegida vacío a la clase para resolver este problema de este modo:

protected Classname(){} 

En su caso, se vería así:

protected Id(){} 
Cuestiones relacionadas