使用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 { }