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

soc*_*soc 51 java database persistence annotations jpa

我使用JPA2两者@Entity@Table有一个name属性,例如:

@Entity(name="Foo")
@Table (name="Bar")
class Baz
Run Code Online (Sandbox Code Playgroud)

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

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

在编写查询时,工作解决方案将如何显示以及我将以哪个名称引用实体?

更新.我添加name="GROUPS"了两个注释Group并执行了相同的操作User,但现在我收到此错误:

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

Internal Exception: java.sql.SQLException: Table not found in statement [SELECT ID, MAXIMUMROLE, MEMBERSHIPS_ID FROM USERS]
Run Code Online (Sandbox Code Playgroud)

Dha*_*ath 81

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

如果你有课

 @Entity
 class MyEntity {}
Run Code Online (Sandbox Code Playgroud)

将创建名为" MyEntity "的表,实体名称为MyEntity.您的JPQL查询将是:

 select * from MyEntity
Run Code Online (Sandbox Code Playgroud)

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

如果你有课

 @Entity(name="MyEntityName")
 @Table(name="MyEntityTableName")
 class MyEntity {}
Run Code Online (Sandbox Code Playgroud)

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

您的JPQL查询将是:

 select * from MyEntityName
Run Code Online (Sandbox Code Playgroud)

  • 我(错误)从互联网上学习了JPA,我提供了现有MySQL表的名称作为实体名称作为映射两者的方式.这对我有用但只是巧合,因为Hibernate(可能所有JPA实现?)使用实体名称作为默认表名,如果没有提供@Table"name".但是,一旦我开始使用JPQL查询而不是CriteriaBuilder查询,我开始得到"FooBar未映射"异常,因为我在不知不觉中改变了我在查询中引用实体所需的方式.我希望分享我的错误有助于某人. (4认同)

Mau*_*res 26

名称@Entity是JPA-QL查询,它默认为类名,而不包(或不合格的类名,在Java行话),如果你改变它,你必须确保你建立查询时使用此名称.

名称@Table就是这种实体被保存表名.


小智 5

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

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

注意:如果您不使用@Table,则休眠@Entity默认情况下会认为这是您的表名

@Entity    
@Table(name = "emp")     
public class Employee implements java.io.Serializable { }
Run Code Online (Sandbox Code Playgroud)