为什么实体类必须有@Id?

时间:2017-07-17 00:51:58

标签: jpa entity primary-key

我对此感到有些困惑。当我尝试创建一个没有@Id的实体时,编译时给了我一个错误,我必须设置主键使用@Id,我甚至无法将应用程序部署到应用程序服务器(我使用payara)。但是,官方Java EE 7教程文档中对实体类的要求不包含实体必须具有@Id的规则。并且,该文档中的实体定义:

  

通常,实体表示关系数据库中的表,每个实体实例对应于该表中的一行。

但我可以创建一个没有主键的数据表。

所以我的问题实际上是为什么我们必须在一个实体中设置@Id。还有其他考虑因素吗?例如,使用@Id来标识持久化上下文中的特定实体,以便我们可以使用em.find(id)?如果我坚持创建一个没有@Id的实体,我该怎么办,哈哈。

感谢您的帮助。

3 个答案:

答案 0 :(得分:2)

JPA实体bean需要以某种方式指定主键。

来自 JSR 338:JavaTM Persistence API,2.1版规范

  

2.4主要密钥和实体身份

     

每个实体都必须有一个主键。

     

主键必须在作为实体层次结构的根的实体类上定义,或者在映射的超类上定义,该超类是实体层次结构中所有实体类的(直接或间接)超类。主键必须在实体层次结构中只定义一次。

     

主键对应于实体类的一个或多个字段或属性(“属性”)   ...

答案 1 :(得分:1)

实体是您存储在数据库中的东西(我无法提出您不会这样做的用例)。存储在数据库表中的东西需要有一个主键。对于主键,我们通常使用Id。

我非常确定您收到的警告是否有所补充?您确定自己没有忘记某些事情吗?' IDE的功能,可以在设置中禁用。

答案 2 :(得分:0)

如果我谈论数据库,则每个表都应具有一些列(或多个列) 可以唯一地标识特定的行。

以同样的方式,因为我们的实体类表示一个表,所以在那里非常需要 @Id

(我的回答只是对那些初学者的提示。)