使用 JPA 时,@Entity 和 @Table 中的 name 参数有啥区别?

Posted

技术标签:

【中文标题】使用 JPA 时,@Entity 和 @Table 中的 name 参数有啥区别?【英文标题】:What's the difference between the name argument in @Entity and @Table when using JPA?使用 JPA 时,@Entity 和 @Table 中的 name 参数有什么区别? 【发布时间】:2011-11-07 17:25:00 【问题描述】:

我正在使用 JPA2,@Entity@Table 都有一个 name 属性,例如。 g.:

@Entity(name="Foo")
@Table (name="Bar")
class Baz

我应该使用什么,哪些是可选的?

在我的具体情况下,我有一个类 User 和一个类 Group,它们有额外的要求(据我所知),因为它们是 SQL 中的保留字。

一个可行的解决方案是什么样子的?在编写查询时我会使用哪个名称来引用实体?

更新:我在Group 的两个注释中添加了name="GROUPS",并为User 做了同样的事情,但现在我收到了这个错误:

Exception Description: The table [USERS] is not present in this descriptor.
Descriptor: RelationalDescriptor(example.Group --> [DatabaseTable(GROUPS)])

还有这个错误

Internal Exception: java.sql.SQLException: Table not found in statement [SELECT ID, MAXIMUMROLE, MEMBERSHIPS_ID FROM USERS]

【问题讨论】:

【参考方案1】:

@Entity 中的 name 用于 JPA-QL 查询,它默认为没有包的类名(或 Java 术语中的非限定类名),如果你更改它,你必须确保在构建查询时使用此名称。

@Table 中的 name 是保存此实体的表名。

【讨论】:

【参考方案2】:

@Table 是可选的。将 POJO 类注释为实体时需要 @Entity,但 name 属性不是必需的。

如果你有课

 @Entity
 class MyEntity 

将创建一个名为“MyEntity”的表,实体名称为MyEntity。您的 JPQL 查询将是:

 select * from MyEntity

在 JPQL 中,您始终使用实体名称,默认情况下它是类名称。

如果你有课

 @Entity(name="MyEntityName")
 @Table(name="MyEntityTableName")
 class MyEntity 

然后创建名称为 MyEntityTableName 的表,实体名称为 MyEntityName

您的 JPQL 查询将是:

 select * from MyEntityName

【讨论】:

我(错误)从互联网上学习了 JPA,并且我提供了现有 mysql 表的名称作为实体名称作为映射两者的一种方式。这对我有用,但只是巧合,因为如果未提供 @Table "name",Hibernate(可能是所有 JPA 实现?)使用实体名称作为默认表名称。但是,当我开始使用 JPQL 查询而不是 CriteriaBuilder 查询时,我开始收到“FooBar 未映射”异常,因为我在不知不觉中改变了在查询中引用实体的方式。我希望分享我的错误对某人有所帮助。【参考方案3】:

@Entity 可用于模型类来表示这是实体或表

@Table 用于为您的表提供任何特定名称,如果您想提供任何不同的名称

注意:如果你不使用@Table,那么hibernate认为@Entity是你默认的表名

@Entity    
@Table(name = "emp")     
public class Employee implements java.io.Serializable  

【讨论】:

以上是关于使用 JPA 时,@Entity 和 @Table 中的 name 参数有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

JPA-基本注解

JPA的@Entity@Table@Column@Id

JPA的@Entity@Table@Column@Id

2JPA-Annotation

JPA继承方式

JPA之@Entity@Table@Column@Id