JPA @Entity注解的确切含义是什么?

43

我正在学习在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注释的确切含义是什么?


1
@Table 注解是可选的。那么如果没有它,JPA 怎么知道一个类要被映射到 ORM 过程中使用呢? - geoand
1
@Entity是可选的,因为您可以在orm.xml中定义哪些类是实体。 - Neil Stockton
1
亲爱的尼尔,如果我们谈论类级别注释,那么在这种情况下,@Entity是必需的。 - Hayk Mkhitaryan
3个回答

68

@Entity注解定义了一个类可以映射到表。它只是一个标记,就像Serializable接口一样。

而为什么@Entity注解是必需的呢?这是JPA的设计方式。当您创建一个新实体时,至少要做两件事:

  1. 使用@Entity进行注释

  2. 创建一个id字段并对其进行注解@Id

其他任何内容都是可选的,例如表名从实体类名派生(因此@Table注解可以省略),表的列从实体变量派生(因此@Column注解可以省略)等等...

JPA试图为希望学习/使用该API的开发人员提供快速和容易的入门,并为开发人员提供尽可能少配置的选项以使一些功能正常工作,这是该API想要实现这种“易于使用/学习”的目标的方法之一。因此@Entity注解(连同@Id注解)是创建实体所必须做的最小操作。


1
如果“@Entity注释定义了一个类可以映射到表”,为什么他们不直接使用@Table呢!?这样会更清晰明了! - Ian Vaughan
1
@IanVaughan 这也可能支持存储在数据存储中的实体,该存储不知道表格,例如一些nosql键值存储? - Frank Hopkins

2
JPA中的实体是指代表可以持久化到数据库的数据的POJO。一个实体表示存储在数据库中的表。每个实体实例都代表表中的一行。
更多关于实体的信息: https://www.baeldung.com/jpa-entities

网站链接中有很好的引语。 - Combine

0

实体是使用容器管理的持久性自动存储在关系数据库中的持久数据。它们是持久的,因为它们的数据以某种形式存储在数据存储系统中,例如数据库:它们可以在服务器故障、故障转移或网络故障时幸存下来。当实体被重新实例化时,先前实例的状态会自动恢复。

实体模拟业务实体或单个业务流程中的多个操作。实体通常用于促进涉及数据和对该数据进行计算的业务服务。例如,您可以实现一个实体来检索并对采购订单中的项目执行计算。您的实体可以在执行任务时管理多个依赖的持久对象。

实体可以表示细粒度的持久对象,因为它们不是远程可访问的组件。

实体可以聚合对象,并使用JPA持久性提供程序的事务、安全和并发服务有效地持久化数据和相关对象。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接