java - metodos - Ningún constructor predeterminado para entidad para clase interna en Hibernate
como instanciar una clase en java netbeans (3)
Si la clase no es static
, requiere una instancia de la clase externa para poder crear una instancia, por lo que no habrá un constructor predeterminado. Tendría que usar una sintaxis similar a:
new Supply().new Id();
Si la clase Id
es static
, solo puede llamar:
new Id();
Tengo dos clases. Una es la clase de entidad, la otra sirve como una clase de clave compuesta.
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 uso intente 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, descubrí que si cambio el Id de clase a estático . Todo estará bien.
Solo tengo curiosidad sobre cómo pueden suceder todas estas cosas.
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.
Actualizar
Como yo esperaba:
$ javap -classpath . Supply/$Id
Compiled from "Supply.java"
class Supply$Id extends java.lang.Object{
final Supply this$0;
Supply$Id(Supply);
}
Siempre agrego un constructor protegido vacío a la clase para resolver este problema de la siguiente manera:
protected Classname(){}
En tu caso, se vería así:
protected Id(){}