@ Entity 和@Table 中的 Name 属性

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

例如,允许 name 属性具有相同的值

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

我也可以给同一个班起不同的名字

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

有人能告诉我这两者之间的区别吗? 为什么我们在两者中有相同的属性?

131277 次浏览
@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中给出的名称,而 @ 桌子中给出的名称将用于在数据库中命名表。

So in HQL your 什么东西 will refer to 另一件事 in the DB.

此名称将用于识别域。.该名称只能由 hql查询标识。.也就是说。.域对象的名称

此名称将用于域对象引用的表. . 即. . 表的名称

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

@Entity对于模型类来表示这是实体或表非常有用

如果要提供任何不同的名称,则使用 @Table向表提供任何特定的名称

注意: 如果您不使用 @Table,那么休眠考虑到 @Entity是您的表名默认和 @Entity必须

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


}

下面是一个真实的示例,其中包含一些很好的实践技巧,因为我刚刚花了2个小时试图弄清楚为什么我的 HQL 查询会抛出

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

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

@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);
}

顺便说一下,对于实体名称使用类名或驼峰大小写名称,对于表和列名称使用小写字母加下划线(如上例所示) ,这是一个很好的实践。请参阅更多关于 DB 命名约定的内容: Https://www.sqlshack.com/learn-sql-naming-conventions/.

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

select * from some_thing where id=xxx;