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]
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
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.
@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 { }