Constructeur explicite utilisant Lombok?
Je suis à la réécriture de certains désordre code qui gère une base de données, et vu qu'à l'origine le programmeur a créé une classe mappé à la base de données comme suit:
(J'ai enlevé code inutile qui n'a pas de but dans cette question)
@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;
}
}
Je suis encore un débutant en veille prolongée et à l'aide de Lombok, mais ne serait-ce pas la même chose et ne serait pas Lombok créer automatiquement le besoin constructeur pour vous?
@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());
}
Aussi, le programmeur original de ce code, dit-il permet l'en-tête à 'null', mais il les a créés explicitement un constructeur qui a besoin d'une valeur d'en-tête. Ai-je raté quelque chose ou est-ce un peu contradictoire?
source d'informationauteur FinalArt2005
Vous devez vous connecter pour publier un commentaire.
Ont un coup d'oeil à
@NoArgsConstructor, @RequiredArgsConstructor, @AllArgsConstructor
.Le constructeur comportement de
@Data
est comme@RequiredArgsConstructor
:Donné qu'aucun de vos champs sont
final
ou@NonNull
il en résultera un constructeur sans argument. Cependant, ce n'est pas le plus expressif de la façon d'obtenir ce comportement.Ce que vous voudrez probablement dans ce cas est un
@NoArgsConstructor
(éventuellement combiné avec un@AllArgsConstructor
), afin de communiquer clairement le comportement voulu, comme il est également indiqué dans la documentation:Que peu contradictoire vous avez raison. Je n'ai pas utilisé de Lombok avant, mais avec mise en veille prolongée si vous voulez être en mesure de créer un haricot et persistent, vous devez le constructeur par défaut ci-dessus comme point j'étais au courant. Il utilise Constructeur.newInstance() pour instancier de nouveaux objets.
Voici quelques hibernate documentation qui va plus dans le détail.
Documentation Hibernate
Si vous utilisez @Data avec un @Non le terrain et veulent encore noargs-constructeur, vous pourriez veux essayer d'ajouter tous les 3 annotation ensemble
Apparemment un vieux intelliJ bug que j'ai fait reproduire dans Eclipse Kepler et de lombok v0.11.4