我有疑问,因为 @Entity 和 @Table 中都有 name 属性
例如,我允许 name 属性具有相同的值
@Entity(name = "someThing")
@Table(name = "someThing")
我也可以为同一个班级取不同的名字
@Entity(name = "someThing")
@Table(name = "otherThing")
谁能告诉我这两者之间有什么区别以及为什么我们两者具有相同的属性?
我有疑问,因为 @Entity 和 @Table 中都有 name 属性
例如,我允许 name 属性具有相同的值
@Entity(name = "someThing")
@Table(name = "someThing")
我也可以为同一个班级取不同的名字
@Entity(name = "someThing")
@Table(name = "otherThing")
谁能告诉我这两者之间有什么区别以及为什么我们两者具有相同的属性?
@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将引用数据库中的otherThing。
@Entity(name = "someThing")
=> 此名称将用于识别域..此名称将仅由hql
查询识别..即..域对象的名称
@Table(name = "someThing")
=> 此名称将用于域对象引用的表..即..表的名称
@Entity
与模型类一起用于表示这是实体或表
@Table
如果您想提供任何不同的名称,则用于为您的表提供任何特定名称
注意:如果你不使用@Table
,那么 hibernate 默认认为这@Entity
是你的表名,并且@Entity
必须
@Entity
@Table(name = "emp")
public class Employee implements java.io.Serializable
{
}
这是一个带有一些良好实践技巧的真实示例,因为我只花了 2 个小时试图弄清楚为什么我的 HQL 查询会抛出
Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: MyEntity is not mapped [SELECT e FROM MyEntity e ...
my_entity
当我在 @Entity 注释中使用时出现异常。
@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;
@Table 的 name 属性是实际的表名。如果您有两个具有相同名称的 @Entity 类并且您需要在运行查询时区分它们,@Entity 的名称很有用。