我重写了一些凌乱的代码管理数据库,看到原来的程序员创建映射到数据库,像这样一类:

(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}
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top