【问题标题】:How do I use all-argument constructor for JPA Entity with JoinColumn?如何使用带有 JoinColumn 的 JPA 实体的全参数构造函数?
【发布时间】:2021-06-04 20:29:06
【问题描述】:

我正在开发一个 Spring Boot 应用程序(REST 存储库、JPA、PostgreSQL)来托管项目的 REST API。用户可以选择一种植物来种植。这是存储与用户关联的植物数据的实体的一部分代码。

@Data
@Entity
@NoArgsConstructor
@Table(name = "plant")
public class Plant {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "plant_id")
    private UUID plantID;

    @ManyToOne(cascade = CascadeType.MERGE, fetch = FetchType.EAGER)
    @JoinColumn(name = "user_id")
    private User user;

    @ManyToOne(cascade = CascadeType.MERGE, fetch = FetchType.EAGER)
    @JoinColumn(name = "species_id")
    private PlantSpecies species;

    @Column(name = "date_of_planting")
    private Date dateOfPlanting;
}

我正在尝试创建一个 API,用于创建 Plant 的新实例并将其保存到我的数据库中。理想情况下,请求应该给我一个userID 和一个speciesID,我应该能够用这样的东西构造一个新的Plant

    // PROBLEM HERE
    public Plant(String userID, String speciesID) {
        this.user = userID;
        this.species = speciesID;
        this.dateOfPlanting = new Date();
    }

我的数据库中的表只存储了各自的外键(字符串),所以如果我需要插入一条新记录,我应该能够简单地存储字符串,对吧?但是在实体中,数据不存储为字符串,它们是这些类的对象。在这种情况下,构造函数代码显然是错误的。我知道我的逻辑有缺陷,但我无法确定在哪里以及如何修复它。

我可以选择查询 User 和 PlantSpecies 表以获取记录,并将其传递给此构造函数,这将解决我的错误,但我觉得这是错误的。我不应该获取整条记录来存储我已经拥有的 ID。在此先感谢您的任何帮助!

【问题讨论】:

  • 如果您必须在使用时使用 JPA,您必须首先从数据库中获取用户,然后在 Plant 实体的构造函数中设置此用户对象。如果您必须将一个实体对象与另一个实体对象相关联,这就是 JPA 的工作方式。如果您不想先获取用户并将该用户对象与Plant 对象相关联,那么您必须删除关系@ManyToOne 注释并将其存储为任何适合的字符串类型或整数类型的普通数据列你的场景。需要注意的一件事是指定的用户 ID 确实存在于您的数据库中。
  • @Naqi 我希望我不必走任何一条路线:/ 我想我现在会使用你提到的第一个选项。谢谢!
  • 我已发布我的评论作为答案,请接受此作为对您问题的答案。它也可能对其他人有所帮助。

标签: java spring postgresql spring-boot jpa


【解决方案1】:

如果你必须使用 JPA,你必须首先从数据库中获取用户,然后在 Plant Entity 的构造函数中设置这个用户对象。如果您必须将一个实体对象与另一个实体对象相关联,这就是 JPA 的工作方式。如果您不想先获取用户并将该用户对象与 Plant 对象相关联,那么您必须删除关系 @ManyToOne 注释并将其存储为字符串类型或整数类型的普通数据列,无论您的场景是否适合.需要注意的一件事是,在将此 ID 分配给植物对象之前,您的数据库中确实存在指定的用户 ID

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-03
    • 2014-08-30
    • 2015-07-04
    • 2022-01-27
    • 2015-06-16
    • 2021-10-25
    相关资源
    最近更新 更多