@Entity和@Table中的name属性

66 java persistence annotations hibernate jpa

我怀疑名称属性是否存在于两者中

@Entity和@Table

例如,我可以为name属性设置相同的值

@Entity(name = "someThing")
@Table(name = "someThing")
Run Code Online (Sandbox Code Playgroud)

同一个班级我也可以有不同的名字

 @Entity(name = "someThing")
 @Table(name = "otherThing")
Run Code Online (Sandbox Code Playgroud)

任何人都可以告诉我这两者之间有什么区别以及为什么我们两者都有相同的属性?

ank*_*kit 81

@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
Run Code Online (Sandbox Code Playgroud)

因此,在第一种情况下,您的表和实体将具有相同的名称,这将允许您在编写HQL或JPQL时访问与实体同名的表.

在第二种情况下,在编写查询时,您必须使用@Entity中给出的名称,并且@Table中给出的名称将用于命名数据​​库中的表.

因此在HQL中,someThing将引用DB中的otherThing.


小智 16

@Entity(name = "someThing")=>此名称将用于标识域名.此名称仅由hql域对象的查询..ie ..name 标识

@Table(name = "someThing") =>此名称将用于表objectes..ie ..name引用的表


Nes*_*aev 12

这是一个现实生活中的示例,其中包含一些很好的实践技巧,因为我刚刚花了 2 个小时试图找出为什么我的 HQL 查询会抛出

Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: MyEntity is not mapped [SELECT e FROM MyEntity e ...当我my_entity在 @Entity 注释中使用时出现异常。

@Entity name 用于在整个应用程序中引用您的实体,特别是在 HQL 查询中,@Table 是实际的数据库表名称,例如:

@Entity(name = "SomeThing")
@Table(name = "some_thing")
public class SomeThing {
    @Id
    private Long id;
}
Run Code Online (Sandbox Code Playgroud)

,那么您的 JPA 存储库可能类似于:

    @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);
    }
Run Code Online (Sandbox Code Playgroud)

顺便说一句,使用类名或驼峰式名称作为实体名称,使用小写字母并用下划线分隔表和列名称是一个很好的做法(如上面的示例)。有关数据库命名约定的更多信息,请参阅: https://www.sqlshack.com/learn-sql-naming-conventions/

在实际的数据库中(或者如果您使用旧式 JDBC 查询)您将使用:

select * from some_thing where id=xxx;
Run Code Online (Sandbox Code Playgroud)


小智 11

@Entity 对于模型类很有用,表示这是实体或表

@Table 用于为您的表提供任何特定名称,如果您想提供任何不同的名称

注意:如果你不使用@Table那么hibernate @Entity默认情况下认为这是你的表名,@Entity必须

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

}
Run Code Online (Sandbox Code Playgroud)


Cor*_*ral 5

@Table的name属性是实际的表名。如果您有两个具有相同名称的 @Entity 类,并且在运行查询时需要一种方法来区分它们,则 @Entitiy 的名称很有用。

  • 什么时候有两个同名的实体?是不是类名相等,但类在不同的包中(限定名不同)? (4认同)