1. 簡單說明
1、聲明該字段爲 transient
private transient List<SpecParam> params;
2、聲明該字段爲 static
private static List<SpecParam> params;
3、通過註解@TableField(exist = false)聲明
@TableField(exist = false)
private List<SpecParam> params;
以上三種方式可使對象中的屬性不被序列化
2. MP 排除表中不存在字段的三種方式
首先來設定一個場景: 有這樣一個Java實體類:Book
@Data
@TableName("t_book")
public class Book {
@TableId
private long id;
private String bookName;
private String remarks;
}
在此我們假設數據庫中有一張t_book表,有主鍵id、書名兩個字段。在Book類中remarks屬性不屬於這張表。
這時候加入有一個插入操作,類似於:
Book book = new Book();
book.setId(1)
book.setBookName("《Thinking In Java》");
book.setRemarks("我是圖書的備註");
int rows = bookMapper.insert(book);
這時會報錯,因爲數據表中並不存在remarks字段。會報出字段不存在的異常,這時因爲MP幫助我們做了映射。
解決方式一:添加transient關鍵字
在不是表中字段的屬性前加上關鍵字transient,代表使用該關鍵字標識的屬性,不會參與序列化過程。
如代碼:
@Data
@TableName("t_book")
public class Book {
@TableId
private long id;
private String bookName;
private transient String remarks;
}
缺點是不能參與序列化了
解決方式二:聲明變量爲static類型
代碼如下:
@Data
@TableName("t_book")
public class Book {
@TableId
private long id;
private String bookName;
private static String remarks;
public static String getRemarks() {
return remarks;
}
public static oid setRemarks(String remarks) {
Book.remarks = remarks;
}
}
注意
Lombok的@Data註解不會將靜態變量生成getter、setter方法。
缺點:所有的Book都將設置成一樣的。假如我們的需求是每一個Book對象都需要一份remarks字段,那聲明成靜態屬性是不可以的。
解決方式三:使用MP的註解@TableField(exist = false) 代碼如下:
@Data
@TableName("t_book")
public class Book {
@TableId
private long id;
private String bookName;
@TableField(exist = false)
private String remarks;
}
說明: 這個exisit屬性默認是true,即MP會爲所有字段自動映射。在此設置成false即可。