128 votes

Attribut Name dans @Entity et @Table

J'ai un doute, car l'attribut name est présent à la fois dans @Entity et @Table.

Par exemple, j'ai le droit d'avoir la même valeur pour l'attribut "nom".

@Entity(name = "someThing")
@Table(name = "someThing")

et je peux aussi avoir des noms différents pour la même classe.

 @Entity(name = "someThing")
 @Table(name = "otherThing")

Quelqu'un peut-il me dire quelle est la différence entre les deux et pourquoi nous avons le même attribut dans les deux ?

155voto

ankit Points 839
@Entity(name = "someThing") => this name will be used to name the Entity
@Table(name = "someThing")  => this name will be used to name a table in DB

Ainsi, dans le premier cas, votre table et votre entité auront le même nom, ce qui vous permettra d'accéder à votre table avec le même nom que l'entité en écrivant HQL ou JPQL.

Et dans le second cas, lorsque vous écrivez des requêtes, vous devez utiliser le nom donné dans le fichier @Entity et le nom donné dans @Table sera utilisé pour nommer la table dans la BD.

Ainsi, en HQL, votre quelque chose se référera à autre chose dans la BD.

24voto

@Entity(name = "someThing") => ce nom sera utilisé pour identifier le domaine ..ce nom ne sera identifié que par hql requêtes ..ie ..nom de l'objet de domaine

@Table(name = "someThing") => ce nom sera utilisé pour désigner la table à laquelle l'objet de domaine fait référence, c'est-à-dire le nom de la table.

20voto

Bhuwan Tripathi Points 208

@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 voulez fournir un nom différent.

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

@Entity    
@Table(name = "emp")     
public class Employee implements java.io.Serializable    
{

}

12voto

Nestor Milyaev Points 899

Voici un exemple concret avec quelques conseils de bonne pratique, car je viens de passer 2 heures à essayer de comprendre pourquoi ma requête HQL lançait le message suivant

Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: MyEntity is not mapped [SELECT e FROM MyEntity e ... exception lorsque j'ai utilisé le my_entity dans l'annotation @Entity.

Le nom @Entity est utilisé pour faire référence à votre entité dans toute l'application, notamment dans les requêtes HQL, et @Table est le nom réel de la table de la BD, par exemple :

@Entity(name = "SomeThing")
@Table(name = "some_thing")
public class SomeThing {
    @Id
    private Long id;
}

alors votre référentiel JPA pourrait être quelque chose comme :

    @Repository
    public interface BikeOfferRepository extends JpaRepository<SomeThing, Long> {

        /** A contrived example as in reality you'd use built-in 
            query for this type of select */
        @Query("SELECT o FROM SomeThing WHERE o.id =:id") // <-- Here you use "SomeThing", the entity name in HQL
        SomeThing findAllByBikeOwner(@Param("id") Long id);
    }

Par ailleurs, il est recommandé d'utiliser le nom de la classe ou le nom en majuscules pour le nom de l'entité et les minuscules espacées par des tirets bas pour les noms des tables et des colonnes (comme dans mon exemple ci-dessus). Voir ici pour plus d'informations sur les conventions de dénomination des bases de données : https://www.sqlshack.com/learn-sql-naming-conventions/ .

Et dans la base de données actuelle (ou si vous utilisez des requêtes JDBC à l'ancienne), vous utiliseriez :

select * from some_thing where id=xxx;

5voto

Soumyaansh Points 99

L'attribut name de @Table est le nom réel de la table. Le nom de @Entitiy est utile si vous avez deux classes @Entity avec le même nom et que vous avez besoin d'un moyen de les différencier lors de l'exécution de requêtes.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X