我应该如何定义要使用的 Hibernate 映射,以及 when/where 来使用它?

How should i define which Hibernate mapping to use, and when/where to use it?

i 并且有一个用例,其中有两种用户,即“客户”和“专业人士”。这 2 个实体有一个称为“用户”的父实体,其中每个“用户”根据其角色在“client/professional”中都有一个条目。

让我们考虑一个“客户”。

  1. “用户”与“客户”具有一对一的映射关系
  2. 一个客户下可能有多个“公司”,即“客户”与“公司”是一对多的关系。

我正在使用 spring 引导为此用例创建 REST API。我仍然不知道为什么我应该在 Hibernate 中使用映射。到目前为止,我看到的唯一优势是它的 CASCADING 属性。如果“用户”被删除,所有具有“用户 ID”的 table 也将被刷新。但是考虑一个场景,我需要为“客户”添加“公司”。我很困惑我是应该通过“客户”实体坚持“公司”还是应该直接坚持“客户”实体。我在这里看不到任何主要优势,因为在这两种情况下,我们都会在坚持“客户”之前检查是否存在具有给定 ID 的“客户”table.

用户实体

public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long UID;

    private Integer userRoleId;

    private String username;
    private String email;
    private String phoneNumber;
    private String firstName;
    private String lastName;
    private Long dateOfJoin;
    private Boolean activeStatus;
    private Long createdAt;
    private Long updatedAt;

    @OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "user")
    private Client client;
}

客户端实体

public class Client {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long CID;

    @Column(unique = true)
    private Long userId;
    private Long createdAt;
    private Long updatedAt;

    @OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "client")
    private ClientCompany clientCompany;

    @OneToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "userId" ,referencedColumnName = "UID", insertable = false, updatable = false)
    private User user;
}

客户公司实体

public class ClientCompany {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long CCID;

    private Long clientId;
    private String email;
    private String phoneNumber;
    public String streetAddress1;
    public String streetAddress2;
    public String zipCode;
    public String city;
    public String state;
    public String country;
    private Long createdAt;
    private Long updatedAt;

    @OneToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "clientId", referencedColumnName = "CID", insertable = false, updatable = false)
    private Client client;
}

使用 Hibernate/JPA 的优点是您不需要编码 JDBC 调用。 你只是使用对象。 在您的场景中,

  1. 从数据库加载客户端实例;
  2. 创建一个 ClientCompany 对象;
  3. 为其分配客户端实例(无需检查客户端是否存在,因为您是从数据库中加载它的);
  4. 保存到数据库。

Hibernate 将处理所有事情,您无需编写任何 SQL 语句。

步骤 1) 也可以替换为创建将保存到数据库的新客户端,但 Hibernate 将再次正确处理保存(如果您正确配置)。