JPA实体注解(Entity Annotation)

时间:2022-06-01 21:21:25

今天我们开始学习可以用在实体上的注解,一样的道理,我们还是先弄一张图:

按照难易程度,或者功能划分,我们分为三类,这样方便理解:

基本注解

JPA实体注解(Entity Annotation)

映射关系注解

JPA实体注解(Entity Annotation)

查询注解

JPA实体注解(Entity Annotation)

 

这里我们按照功能分类,也会添加一些后续会使用的注解:比如@EbeddedId,@IdClass等。

我们先来看看注解@Entity

public @interface Entity {

   /**
    * (Optional) The entity name. Defaults to the unqualified
    * name of the entity class. This name is used to refer to the
    * entity in queries. The name must not be a reserved literal
    * in the Java Persistence query language.
    */
   String name() default "";
}

此注解用于指明实体的名称,此名称在JPQL查询的时候使用。看到这里的时候,我想大家应该和我一样,这个name属性和@Table注解的name属性有啥区别呢?

我们再来看看注解@Table

public @interface Table {

    /**
     * (Optional) The name of the table.
     * <p> Defaults to the entity name.
     */
    String name() default "";

    /** (Optional) The catalog of the table.
     * <p> Defaults to the default catalog.
     */
    String catalog() default "";

    /** (Optional) The schema of the table.
     * <p> Defaults to the default schema for user.
     */
    String schema() default "";

    /**
     * (Optional) Unique constraints that are to be placed on 
     * the table. These are only used if table generation is in 
     * effect. These constraints apply in addition to any constraints 
     * specified by the <code>Column</code> and <code>JoinColumn</code> 
     * annotations and constraints entailed by primary key mappings.
     * <p> Defaults to no additional constraints.
     */
    UniqueConstraint[] uniqueConstraints() default {};

    /**
     * (Optional) Indexes for the table.  These are only used if
     * table generation is in effect.  Note that it is not necessary
     * to specify an index for a primary key, as the primary key
     * index will be created automatically.
     *
     * @since Java Persistence 2.1 
     */
    Index[] indexes() default {};
}

可以看出,@Table注解属性全部都是可选的,也就是在大部分情况下,我们至多设置一个name属性。

如果你有一个注解

@Entity
Public class Teacher() {
}

此时将创建一个Teacher表,同时实体的名称为Teacher

在JPQL中,您始终使用实体名称,默认情况下它是类名称。

select * from Teacher

如果你有如下的注解

@Entity( name = "TeacherName")
@Table( name = "TeacherTableName")
Public class Teacher() {
}

此时将创建一个TeacherTableName的表和TeacherName的实体,

在JPQL中的查询情况是:

select * from TeacherName

 

这里给大家一个小的建议,当你需要查询的时候,提醒一下自己,是直接写SQL还是通过实体查询,后面我们学习理解JPQL的时候会详细学习。这里提前说一嘴哈。

 

也许还有同学会问,@Table不是还有很多其他属性吗?不用着急,我们用到的时候会慢慢更新哈。