Quelle est la différence entre l'argument nom dans @Entity et @Table lors de L'utilisation de JPA?

J'utilise JPA2 et les deux @Entity et @Table ont un attribut name , E. G.:

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

que dois-je utiliser, lesquels sont facultatifs?

dans mon cas particulier , j'ai une classe User et une classe Group , qui ont des exigences supplémentaires (pour autant que je comprenne) parce qu'ils sont des mots réservés en SQL.

comment une solution de travail ressemblerait et avec quel nom serait Je me réfère à l'entité lors de la rédaction des requêtes?

mis à Jour. J'ai ajouté name="GROUPS" aux deux annotations dans Group et j'ai fait la même chose pour User , mais maintenant j'ai cette erreur:

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

et

Internal Exception: java.sql.SQLException: Table not found in statement [SELECT ID, MAXIMUMROLE, MEMBERSHIPS_ID FROM USERS]
46
demandé sur soc 2011-08-31 19:18:00

3 réponses

@Table est facultatif. @Entity est nécessaire pour annoter une classe POJO en tant qu'entité, mais l'attribut name n'est pas obligatoire.

si vous avez une classe

 @Entity
 class MyEntity {}

une table avec nom " MyEntity "sera créée et le nom de L'entité sera MyEntity . Votre requête JPQL serait:

 select * from MyEntity

dans JPQL vous utilisez toujours le nom de L'entité et par défaut c'est le nom de la classe.

si vous avez une classe

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

puis une table avec le nom Myentitablename est créée et le nom de l'entité est MyEntityName .

votre requête JPQL serait:

 select * from MyEntityName
74
répondu Dhanush Gopinath 2013-08-23 09:15:02

le nom dans @Entity est pour les requêtes JPA-QL, il est par défaut au nom de classe sans paquet (ou le nom de classe non qualifié, en jargon Java), si vous le changez, vous devez vous assurer d'utiliser ce nom lors de la construction des requêtes.

le nom dans @Table est le nom de la table où cette entité est sauvegardée.

25
répondu Maurício Linhares 2013-02-28 00:12:10

@Entity est utile avec les classes de modèles pour indiquer qu'il s'agit de l'entité ou du tableau

@Table est utilisé pour fournir aucun nom spécifique à votre table si vous souhaitez fournir tout autre nom

Note: Si vous n'utilisez pas @Table alors hibernate considérer que @Entity est votre nom de table par défaut

@Entity    
@Table(name = "emp")     
public class Employee implements java.io.Serializable { }
1
répondu Bhuwan Tripathi 2016-10-16 11:49:57