题
我重写了一些凌乱的代码管理数据库,看到原来的程序员创建映射到数据库,像这样一类:
(I已移除没有目的在这一问题不必要的代码)
@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和使用龙目岛是初学者,但不会这样做同样的事情,也不会自动龙目创建所需的构造适合你?
@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());
}
此外,该代码的原来的程序员说,他允许标题是“空”,但他明确创建需要为头值的构造函数。我缺少的东西,或者这是一个有点矛盾?
解决方案
看一看 @NoArgsConstructor, @RequiredArgsConstructor, @AllArgsConstructor
。
@Data
的构造行为就像@RequiredArgsConstructor
:
@RequiredArgsConstructor生成 构造用1个参数对于每个 的领域,需要进行特殊处理。 所有的最终场获得一个参数,如 以及被标记为任何领域 @NonNull未初始化哪里 它们被声明。
由于不关你的字段或者是final
或@NonNull
,这将导致一个无参数的构造函数。然而,这不是最表达的方式来实现这种行为。
您可能会想在这种情况下,什么是@NoArgsConstructor
(任选一@AllArgsConstructor
相结合),清楚地传达预期的行为,因为在文档中还表示:
特定Java构建体,如 Hibernate和服务提供商 接口需要一个无参数 构造函数。此注释是很有用的 主要结合任一组合 @Data或其它构造中的一个 生成的注释。
其他提示
这一位是矛盾的,你说得对。如果你希望能够创建一个bean,坚持你所需要的默认构造函数上面就我知道的给我还没有过,但与Hibernate使用龙目岛。它采用Constructor.newInstance()来实例化新对象。
下面是一些休眠文件,其进入更多的细节。
如果您正在使用@Data与@NonNull领域,仍然需要一个noargs构造函数,你可能会想尝试添加所有3注释一起
@NoArgsConstructor
@RequiredArgsConstructor
@AllArgsConstructor
显然旧的IntelliJ 错误,这我在Eclipse开普勒和Lombok的v0.11.4
做复制@NoArgsConstructor,
@RequiredArgsConstructor,
@AllArgsConstructor
生成一个不接受参数的构造,每最终/非空字段中的一个参数,或每字段一个参数。阅读这篇龙目岛项目
@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}
}