在 JPA (Java Persistence API) 中,实体类通常通过一系列注解来配置,以便与数据库表进行映射,与Mybatis-plus在功能上,具有一定的相似性,都是持久化框架。
package com.plumcarefree.demo.entity.user;
import javax.persistence.*;
import java.util.Date;
// 用户实体类
@Entity
@Table(name = "user_profile")
public class UserProfile {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer userId;
@Column(name = "username", unique = true)
private String username;
@Column(name = "password")
private String password;
@Column(name = "email")
private String email;
@Column(name = "phone")
private String phone;
@Column(name = "address")
private String address;
@ManyToOne
@JoinColumn(name = "role_id")
private UserRole role;
@ManyToOne
@JoinColumn(name = "user_organization_id")
private UserOrganization userOrganization;
@Column(name = "register_date")
private Date registerDate;
}
以下是对您提供的 UserProfile
类中使用的 JPA 注解的详细解释:
-
@Entity
- 这是一个标记注解,用于指示该类是一个 JPA 实体。这意味着该类将映射到一个数据库表
-
@Table(name = “user_profile”)
- 这是一个注解,用于指定实体类映射到的数据库表的名称。在这个例子中,实体类
UserProfile
映射到名为user_profile
的表
- 这是一个注解,用于指定实体类映射到的数据库表的名称。在这个例子中,实体类
-
@Id
- 这是一个标记注解,用于指定实体类中的一个属性作为主键。
-
@GeneratedValue(strategy = GenerationType.IDENTITY)
- 这是一个注解,用于指定主键值的生成策略。在这个例子中,主键值将自动生成,并且是自增
-
@Column(name = “username”, unique = true)
- 这是一个注解,用于指定实体类中的一个属性映射到数据库表中的一个列。在这个例子中,
username
属性映射到名为username
的列,并且该列是唯一的
- 这是一个注解,用于指定实体类中的一个属性映射到数据库表中的一个列。在这个例子中,
-
@Column(name = “password”)
- 这是一个注解,用于指定实体类中的一个属性映射到数据库表中的一个列。在这个例子中,
password
属性映射到名为password
的列
- 这是一个注解,用于指定实体类中的一个属性映射到数据库表中的一个列。在这个例子中,
-
@Column(name = “email”)
- 这是一个注解,用于指定实体类中的一个属性映射到数据库表中的一个列。在这个例子中,
email
属性映射到名为email
的列
- 这是一个注解,用于指定实体类中的一个属性映射到数据库表中的一个列。在这个例子中,
-
@Column(name = “phone”)
- 这是一个注解,用于指定实体类中的一个属性映射到数据库表中的一个列。在这个例子中,
phone
属性映射到名为phone
的列
- 这是一个注解,用于指定实体类中的一个属性映射到数据库表中的一个列。在这个例子中,
-
@Column(name = “address”)
- 这是一个注解,用于指定实体类中的一个属性映射到数据库表中的一个列。在这个例子中,
address
属性映射到名为address
的列
- 这是一个注解,用于指定实体类中的一个属性映射到数据库表中的一个列。在这个例子中,
-
@ManyToOne
- 这是一个关系注解,用于指定实体类中的一个属性是多对一关系。在这个例子中,
role
和userOrganization
属性都是多对一关系
- 这是一个关系注解,用于指定实体类中的一个属性是多对一关系。在这个例子中,
-
@JoinColumn(name = “role_id”)
- 这是一个注解,用于指定多对一关系中的外键列。在这个例子中,
role
属性的外键列名为role_id
- 这是一个注解,用于指定多对一关系中的外键列。在这个例子中,
-
@JoinColumn(name = “user_organization_id”)
- 这是一个注解,用于指定多对一关系中的外键列。在这个例子中,
userOrganization
属性的外键列名为user_organization_id
- 这是一个注解,用于指定多对一关系中的外键列。在这个例子中,
-
@Column(name = “register_date”)
- 这是一个注解,用于指定实体类中的一个属性映射到数据库表中的一个列。在这个例子中,
registerDate
属性映射到名为register_date
的列
- 这是一个注解,用于指定实体类中的一个属性映射到数据库表中的一个列。在这个例子中,
-
通过注解创建的类与数据库对应之后的作用:
- ORM映射:注解提供了一种对象关系映射(Object-Relational Mapping)的方式,这意味着
UserProfile
类的实例可以直接映射到数据库中user_profile
表的记录。这使得开发者能够以操作对象的方式操作数据库中的数据,无需编写繁琐的SQL语句。 - 数据持久化:通过这些注解,你可以使用诸如Hibernate这样的ORM框架,将Java对象持久化到数据库中,也就是说,可以保存(insert)、更新(update)、删除(delete)以及查询(select)对象。
- 简化数据库操作:注解减少了直接与数据库交互的复杂性,使得开发者可以更加专注于业务逻辑,而不是数据库操作的具体实现。
- 代码维护性提高:当数据库结构发生变化时,只需要更新实体类,而不需要修改使用这些实体类的业务逻辑代码,提高了代码的可维护性。
- 反射和元数据:注解可以被框架在运行时通过反射读取,框架可以利用这些元数据执行相应的数据库操作。
- ORM映射:注解提供了一种对象关系映射(Object-Relational Mapping)的方式,这意味着
-
这个类(用户实体类)与VO(View Object)和DTO(Data Transfer Object)的关系:
- UserProfile(实体类):这是一个JPA实体类,通常直接映射数据库表。实体类通常包含数据库表的所有字段,并且包含与数据库交互的逻辑(如通过ORM框架)。
- VO(View Object):VO是表现层使用的对象,用于封装从后端传送到前端用于显示的数据。VO可以包含一个或多个实体类的部分数据,仅包含前端需要展示的数据。例如,可能会创建一个
UserProfileVO
,它只包含用户名、邮箱和电话,而不包含密码。 - DTO(Data Transfer Object):DTO用于在不同层之间传输数据,特别是在分布式系统中的不同服务之间。DTO可以包含一个或多个实体类的数据,也可以包含多个实体类的组合。例如,
UserProfileDTO
可能不仅包含UserProfile
的信息,还可能包含关联的UserRole
和UserOrganization
的信息。
-
意义:
在实践中,实体类(如UserProfile
)通常会被转换为DTO或VO,以便在不同层之间传递数据。比如,当从数据库检索用户信息时,服务层可能会将UserProfile
实体转换为UserProfileDTO
,然后传递给表现层,表现层再将UserProfileDTO
转换为UserProfileVO
来显示在页面上。这样做的好处是减少了层与层之间的耦合,提高了系统的模块化和灵活性。