@Entity和@Table中的Name属性

126

我有一个疑问,因为名字属性在@Entity和@Table中都存在。

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

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

我可以给同一个类起不同的名称

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

有人能告诉我这两个的区别是什么,为什么我们在两个里面都有同样的属性?


@Entity现在已经被弃用。 - Philip Rego
11
尽管Hibernate的@Entity(即org.hibernate.annotations.Entity)已被弃用,但JPA的@Entity(即javax.persistence.Entity)仍然健在。 - David Siegal
有些困惑。在iOS CoreData中,表被称为“实体”,那么这两个命名方式都是指数据库表,只是名称不同吗?并且每个都用于Hibernate或JPA。如果是的话,我想知道为什么它们不使用相同的名称,如果它们一起工作的话 :) - Zhou Haibo
5个回答

153
@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
因此,在第一种情况下,您的表和实体将具有相同的名称,这将允许您在编写HQL或JPQL时使用与实体相同的名称访问您的表。
而在第二种情况下,在编写查询时,您必须使用@Entity中给定的名称,而@Table中给定的名称将用于命名数据库中的表。
因此,在HQL中,您的someThing将指向DB中的otherThing。

如果我完全不包含@Table,那么默认的表名是什么? - Sergey Zolotarev
如果我完全不包含@Table,那么默认的表名是什么? - undefined

24

@Entity(name = "someThing") => 这个名字将被用来标识该领域对象,它只能由hql查询进行识别..也就是说,这是领域对象的名称。

@Table(name = "someThing") => 这个名字将被用来引用该领域对象所对应的表格..也就是表格的名称。


19

@Entity 用于模型类,表示该类是实体或表。

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

注意:如果您不使用 @Table,则 Hibernate 默认将 @Entity 视为表名,并且必须加上 @Entity

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

}

11
以下是关于IT技术的实际案例和一些良好的实践提示,我刚花了两个小时来弄清楚为什么我的HQL查询在使用@Entity注释中的my_entity时会抛出Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: MyEntity is not mapped [SELECT e FROM MyEntity e ...异常。
@Entity名称用于在整个应用程序中引用实体,特别是在HQL查询中使用,而@Table则是实际的数据库表名称,例如:
@Entity(name = "SomeThing")
@Table(name = "some_thing")
public class SomeThing {
    @Id
    private Long id;
}

如果你使用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);
    }

顺便提一下,对于实体名,建议使用类名或驼峰命名法,对于表 和列名,建议使用小写并在单词之间使用下划线(如上例所示)。了解更多数据库命名规范,请参见此处: https://www.sqlshack.com/learn-sql-naming-conventions/

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

select * from some_thing where id=xxx;

5

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


4
什么情况下会出现两个具有相同名称的实体?是当类名相同时,但这些类位于不同的包中(限定名称不同)吗? - croraf
@croraf: 没错。实体的默认名称是未限定的类名。如果您在不同的包中定义了两个具有相同(未限定)名称的实体,则这两个实体具有相同的实体名称。如果没有消除歧义,您将在启动时看到一个“HibernateJpaConfiguration”错误,告知您不允许定义具有相同JPA实体名称的实体。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接