gpt4 book ai didi

java - 使用 Spring JPA 时在@AllArgsConstructor 中使用 id 字段是否正确?

转载 作者:行者123 更新时间:2023-12-04 17:19:09 28 4
gpt4 key购买 nike

使用 spring-boot和 JPA 我有一个 Entity我想使用 lombok 来减少样板代码。但是在我的实体中有 id field 。我应该把它放在构造函数参数中 @AllArgsConstructor或者我应该从参数列表中删除它(不知何故,如何?),因为它是由 @id 自动生成的和 @GeneratedValue注释?

代码:

@Entity
@NoArgsConstructor // JPA requires empty constructor
@AllArgsConstructor // ? is id in constuctor needed?

@Getter
@Setter
@ToString(exclude = {"room", "customer"})
public class Reservation {

@Id
@GeneratedValue
private long id;

private Room room;
private Customer customer;
private Date dateFrom;
private Date dateTo;
}

最佳答案

对于您在代码中的问题:

@AllArgsConstructor // ? is id in constuctor needed?



不,不需要。此外,对于您在标题中的问题:

Is using id field in @AllArgsConstructor while using Spring JPA correct?



字段 id除非有很好的理由,否则不建议向任何构造函数或 setter 公开。字段 id应该只由 JPA 实现操作。

请注意,当您声明 @Setter 时也会发生此公开。在 Reservation类(class)。

这可以避免从类级别删除注释并注释每个字段以公开但更简单的方法是使用继承。

您可以创建一个基类,如:
@Entity
@Getter
// Choose your inheritance strategy:
//@Inheritance(strategy=InheritanceType.JOINED)
//@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
public abstract class BaseEntity {
@Id
@GeneratedValue
private Long id;
}

请注意,它没有字段 id 的 setter .扩展上面的类,如:
@Entity
@NoArgsConstructor
@AllArgsConstructor
@Getter
@Setter
@ToString(exclude = {"room", "customer"})
public class Reservation extends BaseEntity {
private Room room;
private Customer customer;
private Date dateFrom;
private Date dateTo;
}

构造函数和 setter 将如下所示:
Reservation r1 = new Reservation();
Reservation r2 = new Reservation(room, customer, dateFrom, dateTo);

r1.setRoom(room);
r1.setCustomer(customer);
r1.setDateFrom(dateFrom);
r1.setDateTo(dateTo);

并且没有办法 - 除了 JPA 使用的反射 - 设置字段 id .

不知如何 确实设置了 id但是因为有一个关键字 JPA 和标签 我假设这是 JPA 的东西和字段 id 的 setter实际上根本不需要。

关于java - 使用 Spring JPA 时在@AllArgsConstructor 中使用 id 字段是否正确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48784923/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com