estoy reescribiendo 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:¿Constructor explícito usando Lombok?
(código innecesario He quitado 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 se permite la cabecera para ser 'nulo', sin embargo, creados explícitamente un constructor que necesita un valor de cabecera. ¿Me estoy perdiendo algo o es esto un poco contradictorio?
Sí, leí sobre @RequiredArgsConstructor, pero como es estándar en @Data, no lo agregué. Mi pregunta era si utilicé las anotaciones correctamente ya que el programador original usó Lombok pero no usó anotaciones @NonNull, sino que usó constructores explícitos. Usted dice que ninguno de mis campos es @NonNull, pero mire de cerca mi código (el segundo recuadro), anoté los campos accessionCode y date con @NonNull. Ahora que Hibernate parece necesitar un constructor sin args, ¿sería un buen estilo? @Data @NoArgsConstructor (acceso = AccessLevel.PROTECTED) @RequiredArgsConstructor – FinalArt2005
Sí, ese sería el camino a seguir .. – Tim
bien, simplemente para cualquier persona que también está empezando a utilizar Lombok, acabo de escuchar que no es @RequiredArgsConstructor muy robusto, toma el orden de los campos en su clase para construir el constructor, por lo que si alguien más cambia esta orden, su código que llama al constructor deja de funcionar, por lo que resulta que el constructor explícito sigue siendo la mejor opción. Sin embargo, el @NoArgsConstructor (access = AccessLevel.PROTECTED) parece ser útil si está utilizando Hibernate. Gracias a todos por su ayuda. – FinalArt2005