我正在研究Spring应用程序中的JPA,我对@Entity注释有一些疑问。
所以我有一个像这样的模型类:
@Entity
@Table(name= “T_CUSTOMER”)
public class Customer {
@Id
@Column(name=“cust_id”)
private Long id;
@Column(name=“first_name”)
private String firstName;
@Transient
private User currentUser;
...........................
...........................
...........................
}
好的,我知道 @Entity 注释位于类级别,这意味着作为此类实例的对象的字段将映射到 T_CUSTOMER 数据库表的字段。
但是为什么在 JPA 中必须使用 @Entity 注释,而我不能只使用 @Table 注释将模型对象映射到特定的数据库表?它还有一些我实际上缺少的其他含义?
我错过了什么? @Entity注释的确切含义是什么?
@Entity
注解定义了一个类可以映射到一个表。就是这样,它只是一个标记,例如 Serializable
界面。
为什么
@Entity
注释是强制性的? ...嗯,这就是 JPA 的设计方式。当你创建一个新实体时,你必须至少做两件事
用
@Entity
创建一个 id 字段并用
@Id
其他任何内容都是可选的,例如表名源自实体类名称(因此
@Table
注释可以是可选的),表的列源自实体变量(因此@Column
注释可以是可选的),等等...
JPA 试图为想要学习/使用此 API 的开发人员提供快速、轻松的开始,并为开发人员提供配置尽可能少的内容以使某些功能发挥作用的选项,这是此 API 实现这一目标的方式之一”易于使用/学习”的目标。因此,
@Entity
注释(与 @Id
注释一起)是创建实体所需执行的最少操作。
JPA 中的实体只不过是表示可以保存到数据库的数据的 POJO。实体代表存储在数据库中的表。实体的每个实例代表表中的一行。
有关实体的更多信息: https://www.baeldung.com/jpa-entities
实体表示使用容器管理的持久性自动存储在关系数据库中的持久数据。它们是持久的,因为它们的数据持久存储在某种形式的数据存储系统中,例如数据库:它们确实能够在服务器故障、故障转移或网络故障。当实体被重新实例化时,前一个实例的状态会自动恢复。
实体对单个业务流程中的业务实体或多个操作进行建模。实体通常用于促进涉及数据和数据计算的业务服务。例如,您可以实现一个实体来检索采购订单中的项目并对其执行计算。您的实体在执行其任务时可以管理多个、依赖的、持久的对象。
实体可以表示细粒度的持久对象,因为它们不是远程可访问的组件。
实体可以将对象聚合在一起,并使用 JPA 持久性提供程序的事务性、安全性和并发服务有效地持久性数据和相关对象。
我们用
@Entity
注释该类,以便它可以包含在持久化单元中。
我们这样做是因为“持久性上下文”仅管理持久性单元中包含的那些类集。
对于
persistence.xml
,我们通过使用 <class>
标签将类包含在持久性单元中。此外,如果我们使用 <exclude-unlisted-classes>
标签并将其设置为 false
,持久单元将自动扫描 @Entity
类,我们不需要在 <class>
标签中指定它。