我应该如何定义要使用的 Hibernate 映射,以及 when/where 来使用它?
How should i define which Hibernate mapping to use, and when/where to use it?
i 并且有一个用例,其中有两种用户,即“客户”和“专业人士”。这 2 个实体有一个称为“用户”的父实体,其中每个“用户”根据其角色在“client/professional”中都有一个条目。
让我们考虑一个“客户”。
- “用户”与“客户”具有一对一的映射关系
- 一个客户下可能有多个“公司”,即“客户”与“公司”是一对多的关系。
我正在使用 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 调用。
你只是使用对象。
在您的场景中,
- 从数据库加载客户端实例;
- 创建一个 ClientCompany 对象;
- 为其分配客户端实例(无需检查客户端是否存在,因为您是从数据库中加载它的);
- 保存到数据库。
Hibernate 将处理所有事情,您无需编写任何 SQL 语句。
步骤 1) 也可以替换为创建将保存到数据库的新客户端,但 Hibernate 将再次正确处理保存(如果您正确配置)。
i 并且有一个用例,其中有两种用户,即“客户”和“专业人士”。这 2 个实体有一个称为“用户”的父实体,其中每个“用户”根据其角色在“client/professional”中都有一个条目。
让我们考虑一个“客户”。
- “用户”与“客户”具有一对一的映射关系
- 一个客户下可能有多个“公司”,即“客户”与“公司”是一对多的关系。
我正在使用 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 调用。 你只是使用对象。 在您的场景中,
- 从数据库加载客户端实例;
- 创建一个 ClientCompany 对象;
- 为其分配客户端实例(无需检查客户端是否存在,因为您是从数据库中加载它的);
- 保存到数据库。
Hibernate 将处理所有事情,您无需编写任何 SQL 语句。
步骤 1) 也可以替换为创建将保存到数据库的新客户端,但 Hibernate 将再次正确处理保存(如果您正确配置)。