日韩精品欧美激情国产一区_中文无码精品一区二区三区在线_岛国毛片AV在线无码不卡_亞洲歐美日韓精品在線_使劲操好爽好粗视频在线播放_日韩一区欧美二区_八戒八戒网影院在线观看神马_亚洲怡红院在线色网_av无码不卡亚洲电影_国产麻豆媒体MDX

JPA之@Entity、@Table、@Column、@Id

時間:2020-04-03 10:54:44 類型:JAVA
字號:    

  Java Persistence API定義了一種定義,可以將常規(guī)的普通Java對象(有時被稱作POJO)映射到數(shù)據(jù)庫。

  這些普通Java對象被稱作Entity Bean。

  除了是用Java Persistence元數(shù)據(jù)將其映射到數(shù)據(jù)庫外,Entity Bean與其他Java類沒有任何區(qū)別。

  事實上,創(chuàng)建一個Entity Bean對象相當于新建一條記錄,刪除一個Entity Bean會同時從數(shù)據(jù)庫中刪除對應(yīng)記錄,修改一個Entity Bean時,容器會自動將Entity Bean的狀態(tài)和數(shù)據(jù)庫同步。

  Java Persistence API還定義了一種查詢語言(JPQL),具有與SQL相類似的特征,只不過做了裁減,以便處理Java對象而非原始的關(guān)系表。

  注意:在Hibernate中也有@Entity和Table這兩個注解,但是其中@Entity注解已經(jīng)廢棄,所以本文只分析JPA下的注解

  首先看看個例子:

package com.xwj.entity;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;

import org.hibernate.annotations.GenericGenerator;

@Entity
@Table(name = "xwj_user", schema = "test")
public class UserEntity {

    @Id
    @GeneratedValue(generator = "system-uuid")
    @GenericGenerator(name = "system-uuid", strategy = "uuid")
    @Column(name = "ID", unique = true, nullable = false, length = 32)
    private Integer id;

    @Column(name = "last_name")
    private String lastName;

    @Column(name = "email", length = 32)
    private String email;
    
    //TODO get和set方法略...
    
}

  解釋:

  @Entity 表明該類 (UserEntity) 為一個實體類,它默認對應(yīng)數(shù)據(jù)庫中的表名是user_entity。這里也可以寫成

  @Entity(name = "xwj_user")

  或者

  @Entity

  @Table(name = "xwj_user", schema = "test")

  查看@Entity注解,發(fā)現(xiàn)其只有一個屬性name,表示其所對應(yīng)的數(shù)據(jù)庫中的表名

  @Table 當實體類與其映射的數(shù)據(jù)庫表名不同名時需要使用 @Table注解說明,該標注與 @Entity 注解并列使用,置于實體類聲明語句之前,可寫于單獨語

  句行,也可與聲明語句同行。

  @Table注解的常用選項是 name,用于指明數(shù)據(jù)庫的表名

  @Table注解還有兩個選項 catalog 和 schema 用于設(shè)置表所屬的數(shù)據(jù)庫目錄或模式,通常為數(shù)據(jù)庫名

  如果缺省@Table注解,則class字段名即表中的字段名,所以需要@Column注解來改變class中字段名與db中表的字段名的映射規(guī)則

@Column注釋定義了將成員屬性映射到關(guān)系表中的哪一列和該列的結(jié)構(gòu)信息,屬性如下:
  1)name:映射的列名。如:映射tbl_user表的name列,可以在name屬性的上面或getName方法上面加入;
  2)unique:是否唯一;
  3)nullable:是否允許為空;
  4)length:對于字符型列,length屬性指定列的最大字符長度;
  5)insertable:是否允許插入;
  6)updatetable:是否允許更新;
  7)columnDefinition:定義建表時創(chuàng)建此列的DDL;
  8)secondaryTable:從表名。如果此列不建在主表上(默認是主表),該屬性定義該列所在從表的名字

  如果是主鍵id,還會用到@Id注解

@Id注釋指定表的主鍵,它可以有多種生成方式:
  1)TABLE:容器指定用底層的數(shù)據(jù)表確保唯一;
  2)SEQUENCE:使用數(shù)據(jù)庫德SEQUENCE列萊保證唯一(Oracle數(shù)據(jù)庫通過序列來生成唯一ID);
  3)IDENTITY:使用數(shù)據(jù)庫的IDENTITY列萊保證唯一;
  4)AUTO:由容器挑選一個合適的方式來保證唯一;
  5)NONE:容器不負責(zé)主鍵的生成,由程序來完成。

  其中與@Id一起使用的還有另外兩個注解:@GeneratedValue、@GenericGenerator

       

springboot中@GeneratedValue作用:

 ?。?)、@GeneratedValue注解存在的意義主要就是為一個實體生成一個唯一標識的主鍵、@GeneratedValue提供了主鍵的生成策略。

 ?。?)、@GeneratedValue注解有兩個屬性,分別是strategy和generator,

  generator屬性:

  generator屬性的值是一個字符串,默認為"",其聲明了主鍵生成器的名稱

  (對應(yīng)于同名的主鍵生成器@SequenceGenerator和@TableGenerator)。

strategy屬性:提供四種值:

  -AUTO主鍵由程序控制, 是默認選項 ,不設(shè)置就是這個

  -IDENTITY 主鍵由數(shù)據(jù)庫生成, 采用數(shù)據(jù)庫自增長, Oracle不支持這種方式

  -SEQUENCE 通過數(shù)據(jù)庫的序列產(chǎn)生主鍵, MYSQL  不支持

  -Table 提供特定的數(shù)據(jù)庫產(chǎn)生主鍵, 該方式更有利于數(shù)據(jù)庫的移植

  注意:默認SpringBoot的@GeneratedValue 是不需要加參數(shù)的,但是如果數(shù)據(jù)庫控制主鍵自增(auto_increment)沒有設(shè)置, 參數(shù)就會報錯


<