Pregunta

Estoy volver a escribir algo de código desordenado que gestiona una base de datos, y vio que el programador original creado una clase asignada a la base de datos de este modo:

(He quitado el código innecesario que no tiene ningún propósito en esta pregunta)

@Entity
@Data
@EqualsAndHashCode(callSuper = false, of = { "accessionCode", "header", "date" })
@SuppressWarnings("PMD.UnusedPrivateField")
public class PDBEntry implements Serializable {
    @Id
    @NaturalId
    @NotEmpty
    @Length(max = 4)
    private String accessionCode;

    @NaturalId
    @NotEmpty
    private Date date;

    @NaturalId
    // We allow for the header to be 'null'
    private String header;

    private Boolean isValidDssp;

    @Temporal(TemporalType.TIMESTAMP)
    private Date lastUpdated = new Date(System.currentTimeMillis());

    protected PDBEntry(){}

    public PDBEntry(String accessionCode, String header, Date date){
        this.accessionCode = accessionCode;
        this.header = header;
        this.date = date;
    }
}

Todavía soy un principiante en el uso de Hibernate y Lombok, pero ¿no sería esto hacer lo mismo y me Lombok no crear automáticamente el constructor sea necesario para usted?

@Entity
@Data
@SuppressWarnings("PMD.UnusedPrivateField")
public class PDBEntry implements Serializable {
    @Id
    @NaturalId
    @NotEmpty
    @NonNull
    @Length(max = 4)
    private String accessionCode;

    @NaturalId
    @NotEmpty
    @NonNull
    private Date date;

    @NaturalId
    // We allow for the header to be 'null'
    private String header;

    private Boolean isValidDssp;

    @Temporal(TemporalType.TIMESTAMP)
    private Date lastUpdated = new Date(System.currentTimeMillis());
}

Además, el programador original de este código dice que permite la cabecera para ser 'nulo', sin embargo, crea explícitamente un constructor que necesita un valor de cabecera. Me estoy perdiendo algo o esto es un poco contradictorio?

¿Fue útil?

Solución

Para consultar @NoArgsConstructor, @RequiredArgsConstructor, @AllArgsConstructor .

El comportamiento del constructor @Data es como @RequiredArgsConstructor:

  

@RequiredArgsConstructor genera una   constructor con 1 parámetro para cada   campo que requiere un manejo especial.   Todos los campos finales reciben un parámetro, como se   así como los campos que están marcados como   @NonNull que no se inicializan cuando   se declaran.

Dado que ninguno de sus campos son bien final o @NonNull, esto dará lugar a un constructor sin argumentos. Sin embargo, esto no es la forma más expresiva para lograr este comportamiento.

Lo que probablemente querrá en este caso es un @NoArgsConstructor (opcionalmente en combinación con un @AllArgsConstructor), para comunicar con claridad el comportamiento previsto, como también se indica en la documentación:

  

Ciertas construcciones de Java, como   hibernación y el Proveedor de Servicio   Interfaz de requerir un no-args   constructor. Esta anotación es útil   principalmente en combinación con cualquiera   @Data o uno de los otros constructor   anotaciones de generación.

Otros consejos

Esa parte es contradictorio que tienes razón. No he utilizado antes de Lombok pero con hibernación si desea ser capaz de crear un frijol y persistir necesita el constructor por defecto como se indica más arriba en lo que era consciente. Utiliza Constructor.newInstance () para crear instancias de objetos nuevos.

Aquí hay alguna documentación de hibernación, que entra en más detalles.

Hibernate Documentación

Si está utilizando @Data con un campo @NonNull y todavía quiere una noargs-constructor, es posible que quieras tratar de añadir los 3 juntos anotación

@NoArgsConstructor
@RequiredArgsConstructor
@AllArgsConstructor

Al parecer un viejo IntelliJ error que hice duplicado en Eclipse Kepler y Lombok v0.11.4

@NoArgsConstructor, 
@RequiredArgsConstructor, 
@AllArgsConstructor

Generar constructores que toman ningún argumento, un argumento por campo final / no nulo, o un argumento para cada campo. Lea este Lombok-proyecto

@Data
@RequiredArgsConstructor /*Duplicate method Someclass() in type Someclass*/
@NoArgsConstructor(access=AccessLevel.PRIVATE, force=true)  /*Duplicate method Someclass() in type Someclass*/
@Entity
public class Someclass {      
    @Id
    private  String id;
    private  String name;
    private  Type type; 

    public static enum Type { X , Y, Z}
}

Fijo que al hacer variables miembro final

@Data
@RequiredArgsConstructor 
@NoArgsConstructor(access=AccessLevel.PRIVATE, force=true)
@Entity
public class Someclass {

    @Id
    private final String id;
    private final String name;
    private final Type type; 
    public static enum Type { X , Y, Z}
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top