我有一个疑问,因为名字属性在@Entity和@Table中都存在。
例如,我可以为name属性设置相同的值。
@Entity(name = "someThing")
@Table(name = "someThing")
我可以给同一个类起不同的名称
@Entity(name = "someThing")
@Table(name = "otherThing")
有人能告诉我这两个的区别是什么,为什么我们在两个里面都有同样的属性?
我有一个疑问,因为名字属性在@Entity和@Table中都存在。
例如,我可以为name属性设置相同的值。
@Entity(name = "someThing")
@Table(name = "someThing")
我可以给同一个类起不同的名称
@Entity(name = "someThing")
@Table(name = "otherThing")
有人能告诉我这两个的区别是什么,为什么我们在两个里面都有同样的属性?
因此,在第一种情况下,您的表和实体将具有相同的名称,这将允许您在编写HQL或JPQL时使用与实体相同的名称访问您的表。
@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
而在第二种情况下,在编写查询时,您必须使用@Entity中给定的名称,而@Table中给定的名称将用于命名数据库中的表。
因此,在HQL中,您的someThing将指向DB中的otherThing。
@Table
,那么默认的表名是什么? - Sergey Zolotarev@Table
,那么默认的表名是什么? - undefined@Entity(name = "someThing")
=> 这个名字将被用来标识该领域对象,它只能由hql
查询进行识别..也就是说,这是领域对象的名称。
@Table(name = "someThing")
=> 这个名字将被用来引用该领域对象所对应的表格..也就是表格的名称。
@Entity
用于模型类,表示该类是实体或表。
@Table
用于为表提供特定的名称,如果您想提供不同的名称。
注意:如果您不使用 @Table
,则 Hibernate 默认将 @Entity
视为表名,并且必须加上 @Entity
。
@Entity
@Table(name = "emp")
public class Employee implements java.io.Serializable
{
}
@Entity(name = "SomeThing")
@Table(name = "some_thing")
public class SomeThing {
@Id
private Long id;
}
@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的名称很有用。