Spring Data JPA 中常用註解詳解

一、java對象與數據庫字段轉化

@Entity:標識實體類是JPA實體,告訴JPA在程序運行時生成實體類對應表

@Table:設置實體類在數據庫所對應的表名

@Id:標識類裏所在變量爲主鍵

@GeneratedValue:設置主鍵生成策略,此方式依賴於具體的數據庫

@Entity
@Table(name = "login_log")
public class LoginLogDO{

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String remoteAddr;
private String username;
private String mobile;

...

@Column:表示屬性所對應字段名進行個性化設置

@Column註解一共有10個屬性,這10個屬性均爲可選屬性,各屬性含義分別如下:

name
name屬性定義了被標註字段在數據庫表中所對應字段的名稱;

unique
unique屬性表示該字段是否爲唯一標識,默認爲false。如果表中有一個字段需要唯一標識,則既可以使用該標記,也可以使用@Table標記中的@UniqueConstraint。

nullable
nullable屬性表示該字段是否可以爲null值,默認爲true。

insertable
insertable屬性表示在使用“INSERT”腳本插入數據時,是否需要插入該字段的值。

updatable
updatable屬性表示在使用“UPDATE”腳本插入數據時,是否需要更新該字段的值。insertable和updatable屬性一般多用於只讀的屬性,例如主鍵和外鍵等。這些字段的值通常是自動生成的。

columnDefinition
columnDefinition屬性表示創建表時,該字段創建的SQL語句,一般用於通過Entity生成表定義時使用。(也就是說,如果DB中表已經建好,該屬性沒有必要使用。)

table
table屬性定義了包含當前字段的表名。

length
length屬性表示字段的長度,當字段的類型爲varchar時,該屬性纔有效,默認爲255個字符。

precision和scale
precision屬性和scale屬性表示精度,當字段類型爲double時,precision表示數值的總長度,scale表示小數點所佔的位數。

@Temporal:

  當我們使用到java.util包中的時間日期類型,則可以使用此註釋轉化成java.util包中的類型。

  注入數據庫的類型有三種:

TemporalType.DATE(2008-08-08)

TemporalType.TIME(20:00:00)

TemporalType.TIMESTAMP(2008-08-08 20:00:00.000000001)

@Enumerated:

使用此註解映射枚舉字段,以String類型存入數據庫

注入數據庫的類型有兩種:EnumType.ORDINAL(Interger)、EnumType.STRING(String)

@Embedded、@Embeddable:

  當一個實體類要在多個不同的實體類中進行使用,而其不需要生成數據庫表

@Embeddable:註解在類上,表示此類是可以被其他類嵌套

@Embedded:註解在屬性上,表示嵌套被@Embeddable註解的同類型類

@ElementCollection集合映射

@CreatedDate、@CreatedBy、@LastModifiedDate、@LastModifiedBy:

表示字段爲創建時間字段(insert自動設置)、創建用戶字段(insert自動設置)、最後修改時間字段(update自定設置)、最後修改用戶字段(update自定設置)

例如:

在新建用戶的時候,不用管用戶創建的時間和用戶屬性修改的時間,@CreateDate和@LastModifiedDate註解會自動幫你添加上時間。

@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@CreatedDate
@Column(updatable = false, nullable = false)
protected LocalDateTime gmtCreate;

@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@LastModifiedDate
protected LocalDateTime gmtModified;

這四個註解的使用需要在啓動類上加上@EnableJpaAuditing註解

@SpringBootApplication
@EnableSwagger2//啓動swagger2
@EnableJpaAuditing//啓動@CreatedDate、@CreatedBy、@LastModifiedDate、@LastModifiedBy註解
@EntityScan(basePackages = {"com.bbd.finance.model.domain"})
@EnableJpaRepositories(basePackages = {"com.bbd.finance.model.dao"})
public class App {
    private static final Logger log = LoggerFactory.getLogger(App.class);

    public static void main(String[] args){
        SpringApplication.run(App.class);
    }
}

@MappedSuperclass

實現將實體類的多個屬性分別封裝到不同的非實體類中

  註解的類將不是完整的實體類,不會映射到數據庫表,但其屬性將映射到子類的數據庫字段
  註解的類不能再標註@Entity或@Table註解,也無需實現序列化接口

註解的類繼承另一個實體類 或 標註@MappedSuperclass類,他可使用@AttributeOverride 或 @AttributeOverrides註解重定義其父類屬性映射到數據庫表中字段。

例如:

@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public abstract class BaseDO{
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    protected Long id;

    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @CreatedDate
    @Column(updatable = false, nullable = false)
    protected LocalDateTime gmtCreate;

    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @LastModifiedDate
    protected LocalDateTime gmtModified;

//此處省略get、set方法

}

登陸日誌類繼承BaseDo類(用戶類也繼承該類,這樣就減少了代碼的冗餘)

@Entity
@Table(name = "login_log")
public class LoginLogDo extends BaseDO {

    private String remoteAddr;

    private String username;

    private String employeeNo;

    private boolean status;

    private String reason;

//此處省略get、set方法
}

 

一對一關聯

@OneToOne、@JoinColumn

//企業ID
private Long companyId;

@OneToOne
@JoinColumn(name = "companyId", referencedColumnName = "id",insertable = false,updatable = false, foreignKey = @ForeignKey(name = "none", value = ConstraintMode.NO_CONSTRAINT))

private CompanyInfoDO companyInfoDO;

 

java對象與json轉化(spring註解)

1.@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone="GMT+8"):將Date屬性轉換爲String類型, timezone解決(相差8小時)

 

2.@JsonSerialize:作用在類或字段上,轉化java對象到json格式(需自定義轉化類繼承JsonSerializer<T>)

class DateSerializer extends JsonSerializer<Date> {

 

    @Override

    public void serialize(Date value, JsonGenerator jgen, SerializerProvider provider)

            throws IOException {

        SimpleDateFormat formatter = new SimpleDateFormat(BankAccount.DATE_PATTERN);

        jgen.writeString(formatter.format(value));

    }

}

3.@JsonDeserialize:作用在類或字段上,轉化json格式到java對象(需自定義轉化類繼承JsonDeserializer<T>)

class DateDeSerializer extends JsonDeserializer<Date> {

 

    @Override

    public Date deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException {

        Date date;

        try {

            date = DateUtils.parseDate(jp.getText(), BankAccount.DATE_PATTERN);

        } catch (Exception e) {

            return null;

        }

        return date;

    }

}

4.@JsonProperty:作用在屬性上,把屬性名稱序列化爲另一個名稱(trueName屬性序列化爲name)

5.@JsonIgnoreProperties(ignoreUnknown = true):作用在類上,json序列化時將Java bean中的一些屬性忽略掉可選擇多個字段@JsonIgnoreProperties({“name”},{“age”})json轉javabean時忽略javabean中沒有的字段(如果json中字段javabean中沒有會拋出異常UnrecognizedPropertyException,此時可使用該註解)

6.@JsonIgnore:在json序列化時將java bean中的一些屬性忽略掉,序列化和反序列化都受影響

將時間進行時間格式的轉換

@JsonFormat(pattern="yyyy-MM-dd",timezone = "GMT+8")     出參格式轉換

@DateTimeFormat(pattern = "yyyy-MM-dd")     入參格式轉換

private Date testTime;

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章