关于spring boot java中实体的问题

Posted

技术标签:

【中文标题】关于spring boot java中实体的问题【英文标题】:Question about entities in spring boot java 【发布时间】:2022-01-17 09:25:20 【问题描述】:
package net.employee_managment.springboot.model;



import javax.persistence.*;
import javax.validation.constraints.NotNull;
import java.util.Arrays;

@Entity
@Table(name = "employee")
@Inheritance(strategy = InheritanceType.JOINED)
public class Employee 


    @Id
    @Column(name="employee_id")
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int employee_id;


    @NotNull
    @ManyToOne
    @JoinColumn(name="general_details_id", nullable = false)
    private GeneralDetails generalDetails;


    @NotNull
    @ManyToOne
    @JoinColumn(name="spouse_id", nullable = false)
    private Spouse spouse;

    @NotNull
    @ManyToOne
    @JoinColumn(name="address_Id")
    private Address[] addresses;

    @NotNull
    @ManyToOne
    @JoinColumn(name="child_ID")
    private Child[] children;

.... Constractors, Gettes, Setters

到目前为止,我可以使用 Employee 对象中的对象 ID 来链接对象,并且一切正常。但是现在我有一个对象数组,我很难弄清楚如何将 Address 数组链接到 Employee 对象

【问题讨论】:

【参考方案1】:

@ManyToOne 约束意味着拥有映射的一方存在单一关系。如果您想在所有者方面关联多个对象,那么您确实需要反向注释(即 @OneToMany),我个人总是倾向于将该注释与 List 或 Set 实现相关联(任何都可以)。因此,您的成员变量声明如下所示:

@NotNull
@OneToMany
private Set<Address> addresses;

通过这种方式,您可以将您的 Employee 实例传递给 Address 实例的列表(或在本例中为 Set),并且如果您启用了更新/插入级联(以及 GeneratedId),则集合中的每个地址都将被自动分配父Employee实例持久化时的id。

回答您的后续问题:

从客户端创建 json 帖子只需将地址对象数组嵌入到父 JSON 对象中,例如:


"generalDetails": 1,
"spouse": 2,
"addresses": [
        "street": "streetVal1",
        "town": "townVal1",
        "postCode": "pcVal1"
    ,
    
        "street": "streetVal2",
        "town": "townVal2",
        "postCode": "pcVal2"
    ]

您会注意到,我没有在地址对象上指定 Id 字段,这将在服务器端处理,如前所述 new 地址。对于更新,您当然可以将 id 字段添加到每个地址对象。在任何情况下,JSON 对象结构看起来都与我概述的完全一样。

【讨论】:

非常感谢您的详细回答:)。我不明白的另一件事是我如何创建员工帖子,因为我使用了对象的 id,例如: "generalDetails": 1, "spouse": 2, "addresses":?, "children":? @MichaelFisher 我已更新我的答案以解决您关于将对象发布到服务器的后续问题。如果我的回答对您有所帮助,请点击相应按钮接受。提前致谢。

以上是关于关于spring boot java中实体的问题的主要内容,如果未能解决你的问题,请参考以下文章

尝试在 Java Spring Boot 中从 H2 数据库中获取相关实体

Spring Boot中两个实体之间的多对多关系

如何在 Spring Boot 应用程序中将 java lang long 转换为实体类

Spring Boot配置Mysql后无法根据java实体类生成table

如何在不使用 CrudRepository 的情况下将 java spring boot 应用程序中定义的实体反映在数据库中

在 Spring Boot 中使用生成的 ID 持久化 OneToMany 实体