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