我重写管理数据库有些凌乱的代码,看到原来的程序员创建映射到数据库,像这样一类:使用Lombok的显式构造函数?
(我已经去除了不必要已在此问题上没有用途代码)@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;
}
}
我仍然是Hibernate的初学者和使用Lombok,但不会做同样的事情,不会Lombok自动为您创建所需的构造函数吗?
@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());
}
此外,该代码的原来的程序员说,他允许标题是“空”,但他明确创建需要为头值的构造函数。我错过了什么,或者这有点矛盾吗?
是的,我阅读了@RequiredArgsConstructor,但由于它在@Data中是标准的,我没有添加它。我的问题是,自从原始程序员使用Lombok以来,是否正确使用了注释,但没有使用@NonNull注释,而是使用了显式构造函数。你说我的字段都不是@NonNull,但仔细查看我的代码(第二个框),我用@NonNull注解了accessionCode和日期字段。现在因为Hibernate确实似乎需要一个无参数构造函数,这是否是一种很好的风格? @Data @NoArgsConstructor(access = AccessLevel.PROTECTED) @RequiredArgsConstructor – FinalArt2005 2010-10-06 11:41:07
是的,这将是要走的路.. – Tim 2010-10-06 12:00:08
好吧,只是对于任何人也开始使用龙目岛,我刚才听说@RequiredArgsConstructor不是非常健壮,它需要类中的字段的顺序来构建构造函数,所以如果其他人更改此顺序,调用构造函数的代码将停止工作,所以显式构造函数仍然是更好的选择。但是,如果您使用Hibernate,则@NoArgsConstructor(access = AccessLevel.PROTECTED)似乎很有用。谢谢大家的帮助。 – FinalArt2005 2010-10-06 12:20:53