使用龙目岛的显式构造函数?

2022-09-02 13:22:11

我正在重写一些管理数据库的混乱代码,并看到原始程序员创建了一个映射到数据库的类,如下所示:

(我已经删除了不必要的代码,这些问题没有目的)

@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());
}

此外,此代码的原始程序员说他允许标头为“null”,但他显式创建了一个需要标头值的构造函数。是我错过了什么,还是有点矛盾?


答案 1

看看@NoArgsConstructor,@RequiredArgsConstructor,@AllArgsConstructor

的构造函数行为类似于:@Data@RequiredArgsConstructor

@RequiredArgsConstructor为需要特殊处理的每个字段生成一个构造函数,其中包含 1 个参数。所有最终字段都会获取一个参数,以及标记为@NonNull的任何字段,这些字段未在声明位置初始化。

假设您的字段都不是 或 ,这将导致无参数构造函数。但是,这不是实现此行为的最有表现力的方式。final@NonNull

在这种情况下,您可能需要的是 a(可选择与 a 组合),以清楚地传达预期行为,如文档中所示:@NoArgsConstructor@AllArgsConstructor

某些 java 构造(如休眠和服务提供商接口)需要无参数构造函数。此批注主要与@Data或生成批注的其他构造函数之一结合使用。


答案 2

那一点是矛盾的,你是对的。我以前没有使用过龙目岛,但是如果你想能够创建一个bean并坚持下去,你需要默认构造函数,据我所知,上面给出了默认构造函数。它使用 Constructor.newInstance() 来实例化新对象。

以下是一些休眠文档,其中详细介绍了这些文档。

休眠文档


推荐