simple - Entidad de Java: ¿por qué necesito un constructor vacío?
polimorfismo java (7)
Pero Java siempre te da un constructor vacío invisible predeterminado (si no redefinas uno).
Esta declaración es verdadera solo cuando no proporciona ningún constructor en su clase. Si se proporciona un constructor de argumentos en su clase, entonces jvm no agregará el constructor sin argumentos.
Esto puede sonar estúpido para usted, pero ¿por qué necesito definir un constructor vacío en mi @Entity
s?
Cada tutorial que vi decía: cada entidad necesita un constructor vacío.
Pero Java siempre le da un constructor vacío invisible predeterminado (si no redefine uno).
Gracias.
EDITAR
Creo que hay un problema semántico. Lo que entendí por "necesidad" fue escribir.
Significado: escribe siempre un constructor vacío en tu entidad.
ejemplo:
@Entity
public class MyEntity implements Serializable {
@Id
private String str;
public MyEntity(){}
//here getter and setter
}
Pero Java siempre le da este constructor vacío cuando no lo redefine (escriba otro con parámetros).
En este caso, escribir este constructor vacío parece inútil.
Cuando especificó la etiqueta "JPA", asumo que su pregunta se aplica solo a JPA y no a constructores vacíos en general.
Los marcos de persitencia a menudo utilizan la reflexión y más específicamente la Class<T>.newInstance()
para crear una instancia de sus objetos, luego llamar a los captadores / definidores por introspección para establecer los campos.
Es por eso que necesitas un constructor vacío y getters / setters.
Vea esta pregunta de sobre constructores vacíos en Hibernate.
Desde la etiqueta JPA, supongo que está trabajando con Java Beans. Cada bean necesita tener las siguientes propiedades:
Getters y setters para todas sus variables de instancia principales.
Un constructor vacío.
Todas sus variables de instancia deben ser preferiblemente
private
.
Así la declaración: "toda entidad necesita un constructor vacío".
En realidad no necesitas escribirlo. Lo tienes por defecto. A veces se puede crear private
constructor private
para evitar que los usuarios usen el predeterminado.
public class MyClass{
private MyClass(){}
}
Para patrones singelton, por ejemplo, puede bloquear usando el constructor predeterminado.
A veces, cuando usa el complemento de Gson
para convertir los datos de String Json a Object, exige escribir el constructor predeterminado, de lo contrario no funciona
Java no siempre le da un constructor vacío invisible predeterminado si su clase tiene un constructor de argumentos, debe definir el constructor vacío por su cuenta.
No es necesario definir explícitamente un constructor predeterminado a menos que proporcione otro constructor para la entidad. Si proporciona otro constructor, aparte de uno con la firma del constructor predeterminado, no se creará el constructor predeterminado.
Como las implementaciones de JPA se basan en la existencia de un constructor predeterminado, es necesario incluir el constructor predeterminado que se omitirá.
Se necesita un constructor vacío para crear una nueva instancia a través de la reflexión de su marco de persistencia. Si no proporciona ningún constructor adicional con argumentos para la clase, no necesita proporcionar un constructor vacío porque obtiene uno por defecto.
También puede usar la anotación @PersistenceConstructor que se ve como la siguiente
@PersistenceConstructor
public Movie(Long id) {
this.id = id;
}
para inicializar su entidad si Spring Data está presente en su proyecto. Por lo tanto, se puede evitar el constructor vacío también.