使用JPA时@Entity和@Table中的名称参数有什么区别?

我使用的是JPA2,@Entity和@Table都有一个name属性,例如:

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

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

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

一个工作的解决scheme是怎么样的,在写查询时我会用哪个名字来引用这个实体呢?

更新。 我在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] 

@表是可选的。 @Entity需要注解POJO类作为一个实体,但名称属性不是强制性的。

如果你有一堂课

  @Entity class MyEntity {} 

名称为“ MyEntity ”的表格将被创build,实体名称将为MyEntity 。 您的JPQL查询将是:

  select * from MyEntity 

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

如果你有课

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

那么创build名称为MyEntityTableName的表,实体名称为MyEntityName

您的JPQL查询将是:

  select * from MyEntityName 

@Entity名字用于JPA-QL查询,默认为没有包的类名(或者是Java语言中的非限定类名),如果你改变它,你必须确保在构build查询时使用这个名字。

@Table中的名字是保存这个实体的表名。

@Entity对模型类很有用,表示这是实体或表

如果你想提供任何不同的名字,@Table用来为你的表提供任何特定的名字

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

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