我正在重写一些管理数据库的混乱代码,并看到原始程序员创建了一个映射到数据库的类,如下所示:
(我删除了在此问题中没有任何意义的不必要的代码)
@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());
}
此外,此代码的原始程序员说他允许标头为“null”,但他明确地创建了一个需要标头值的构造函数。我错过了什么或者这有点矛盾吗?
答案 0 :(得分:15)
看看@NoArgsConstructor, @RequiredArgsConstructor, @AllArgsConstructor
。
@Data
的构造函数行为类似于@RequiredArgsConstructor
:
@RequiredArgsConstructor生成一个 构造函数,每个参数有1个参数 需要特殊处理的领域。 所有最终字段都获得一个参数,如 以及任何标记为的字段 @NonNull未初始化在哪里 他们被宣布。
鉴于您的字段都不是final
或@NonNull
,这将导致无参数构造函数。但是,这不是实现此行为的最具表现力的方式。
在这种情况下,您可能需要的是@NoArgsConstructor
(可选择与@AllArgsConstructor
结合使用),以清楚地传达预期的行为,如文档中所示:
某些java构造,例如 hibernate和服务提供者 接口需要一个无参数 构造函数。这个注释很有用 主要与两者结合 @Data或其他构造函数之一 生成注释。
答案 1 :(得分:1)
这一点是矛盾的你是对的。我之前没有使用过Lombok,但是如果你想要能够创建一个bean并且持久存在你需要上面给出的默认构造函数,我就知道了。它使用Constructor.newInstance()来实例化新对象。
以下是一些更详细的hibernate文档。
答案 2 :(得分:1)
如果你正在使用带有@NonNull字段的@Data并且仍然想要一个noargs构造函数,你可能想尝试将所有3个注释一起添加
@NoArgsConstructor
@RequiredArgsConstructor
@AllArgsConstructor
显然是我在Eclipse Kepler和lombok v0.11.4中复制的旧intelliJ错误
答案 3 :(得分:0)
@NoArgsConstructor,
@RequiredArgsConstructor,
@AllArgsConstructor
生成不带参数的构造函数,每个final / non-null字段一个参数,或者每个字段一个参数。阅读此lombok-project
@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}
}
通过使成员变量固定它最终
@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}
}