web-dev-qa-db-fra.com

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 spécifique, j'ai une classe User et une classe Group, qui ont des exigences supplémentaires (pour autant que je comprends) car ce sont des mots réservés en SQL.

À quoi ressemblerait une solution de travail et avec quel nom ferais-je référence à l'entité lors de l'écriture de requêtes?

Mise à jour: j'ai ajouté name="GROUPS" aux deux annotations dans Group et a fait de même pour User, mais maintenant j'obtiens cette erreur:

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

et cette erreur

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

@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 le 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 MyEntityTableName est créée et le nom de l'entité est MyEntityName.

Votre requête JPQL serait:

 select * from MyEntityName
79
Dhanush Gopinath

Le nom dans @Entity est pour les requêtes JPA-QL, il s'agit par défaut du nom de classe sans package (ou nom de classe non qualifié, dans Java jargon), si vous le changez, vous devez vous assurer que vous utilisez ce nom lors de la création de requêtes.

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

25
Maurício Linhares

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

@Table est utilisé pour fournir un nom spécifique à votre table si vous souhaitez fournir un nom différent

Remarque: si vous n'utilisez pas @Table puis hibernent considérer que @Entity est le nom de votre table par défaut

@Entity    
@Table(name = "emp")     
public class Employee implements Java.io.Serializable { }
1
Bhuwan Tripathi