@TableName註解和@Table的區別及說明

@TableName註解和@Table區別

最近開發項目的時候,從一個項目遷移代碼到另一個項目,原有項目用的是Hibernate,現有項目用的是mybatis-plus,代碼遷移過來後,schema屬性用於指定數據庫實例名。

但是@Table屬性schema在mybatis-plus框架中失效瞭,一直找不到對應的實例名。 

前言

@TableName是mybatis-plus中的註解,主要是實現實體類型和數據庫中的表實現映射。

註意,不要將@TableName和@Table註解認為是一個,雖然功能相同,但是,@TableName是mybatis-plus中的註解,@Table是Hibernate中的註解。

@TableName參數說明

在這裡插入圖片描述

@TableName源碼

public @interface TableName {
    java.lang.String value() default "";
    java.lang.String schema() default "";
    boolean keepGlobalPrefix() default false;
    java.lang.String resultMap() default "";
    boolean autoResultMap() default false;
}

@TableName使用

@TableName("sys_user")
// 該註解主要是現實實體類型和數據庫中的表實現映射。
public class SysUser implements Serializable {
    @TableId(type= IdType.AUTO)
    private Long id;
    private String username;
    //用戶名
    private String loginName;
    //登錄密碼,密碼需要加密
    private String password;
}

@Table

當實體類與其映射的數據庫表名不同名時需要使用 @Table 標註說明,該標註與 @Entity 標註並列使用,置於實體類聲明語句之前,可寫於單獨語句行,也可與聲明語句同行。

@Table 標註的常用選項是 name,用於指明數據庫的表名

@Table標註還有一個兩個選項 catalog 和 schema 用於設置表所屬的數據庫目錄或模式,通常為數據庫名。uniqueConstraints選項用於設置約束條件,通常不須設置。

  • name屬性

name屬性用於指定數據庫表名稱

若不指定則以實體類名稱作為表名

  • catalog屬性

catalog屬性用於指定數據庫實例名

當catalog屬性不指定時,新創建的表將出現在url指定的數據庫實例中

當catalog屬性設置名稱時,若數據庫存在和指定名稱一致的實例,新創建的表將出現在該實例中

  • schema屬性

作用與catalog屬性作用一致,可自行測試

  • uniqueConstraints屬性

uniqueConstraints屬性用於設定約束條件

@Table(name="CUSTOMERS",uniqueConstraints={@UniqueConstraint(columnNames={"name"})})
@Entity
public class Customer {
    private Integer id;
    private String name;
    private String email;
    private int age;
    ......
}

小結一下

1.當實體類名和數據庫表名不一致時,name屬性可以實現映射,及時表名一致,也推薦使用,提高程序的可讀性

2.catalog和sechema屬性一般不需要指定

3.uniqueConstraints屬性一般也不需要指定,但是如有需要則可以指定

Table(name=“xx“)與Entity(name=“xx“) 問題

@Entity
@Table(name="T_qibie")

這樣寫的話在hql裡要用實體的名字 from QibieVo

如果是這樣的話

@Entity(name="T_qibie")

這樣寫的話在hql裡要用表的名字 from T_qibie

還有有時候隻能用@Entity(name="T_qibie")的話,可能是:JAVAEE6.0中的 javax.persistence.jar與 hibernate中的hibernate-jpa-2.1-api-1.0.0.Final.jar沖突 ,而我采取的措施是刪除瞭JAVAEE6.0的庫,運行就正常瞭,然後在加進來有正常瞭 。

以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。

推薦閱讀: