una metodos internas instanciar genericos como clases clase anonimas java hibernate composite-key

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(){}