Springboot JPA 枚舉Enum類型存入到數(shù)據(jù)庫的操作
1、使用JPA 的@Enumerated 注解 ,可以直接將Enum映射到數(shù)據(jù)庫中。
但是value的值只有兩種方式選擇,一種是使用枚舉的序號映射,一種是枚舉的名稱來映射。
public enum EnumType {
/** Persist enumerated type property or field as an integer. */
ORDINAL,
/** Persist enumerated type property or field as a string. */
STRING
}
如果想存入枚舉中的自定義的值,則需要實現(xiàn)AttributeConverter接口
2、實現(xiàn)AttributeConverter接口方式
/**
* @param <DB> : 保存到數(shù)據(jù)庫的數(shù)據(jù)類型
* @author peter
* date: 2019-05-15 16:57
**/
public interface PersistEnum2DB<DB> {
DB getData();
}
import javax.persistence.AttributeConverter;
/**
* @param <ATTR> 實體類中枚舉的類型,需實現(xiàn){@link PersistEnum2DB} 接口
* @param <DB> 保存到數(shù)據(jù)庫的數(shù)據(jù)類型
* @author peter
* date: 2019-05-15 16:59
*/
public abstract class AbstractEnumConverter<ATTR extends Enum<ATTR> & PersistEnum2DB<DB>, DB> implements AttributeConverter<ATTR, DB> {
private final Class<ATTR> clazz;
public AbstractEnumConverter(Class<ATTR> clazz) {
this.clazz = clazz;
}
@Override
public DB convertToDatabaseColumn(ATTR attribute) {
return attribute != null ? attribute.getData() : null;
}
@Override
public ATTR convertToEntityAttribute(DB dbData) {
if (dbData == null) return null;
ATTR[] enums = clazz.getEnumConstants();
for (ATTR e : enums) {
if (e.getData().equals(dbData)) {
return e;
}
}
throw new UnsupportedOperationException("枚舉轉化異常。枚舉【" + clazz.getSimpleName() + "】,數(shù)據(jù)庫庫中的值為:【" + dbData + "】");
}
}
使用方式
import com.tourcoo.parking.enums.convert2db.AbstractEnumConverter;
import com.tourcoo.parking.enums.convert2db.PersistEnum2DB;
/**
* @author peter
* create: 2019-05-15 14:33
**/
public enum PayStatus implements PersistEnum2DB<Integer> {
NONPAY(0, "未支付"),
PAID(1, "已支付");
private int code;
private String msg;
PayStatus(int code, String msg) {
this.code = code;
this.msg = msg;
}
public int getCode() {
return code;
}
public String getMsg() {
return msg;
}
@Override
public Integer getData() {
return code;
}
public static class Converter extends AbstractEnumConverter<PayStatus, Integer> {
public Converter() {
super(PayStatus.class);
}
}
}
//支付狀態(tài) @Convert(converter = PayStatus.Converter.class) private PayStatus payStatus;
補充: SpringBoot | Jpa 將Java枚舉映射為基本值類型
解決方法之一:
使用實體屬性類型轉換器AttributeConverter
場景假設:
在代碼中使用枚舉類來映射用戶性別(如下代碼所示),在數(shù)據(jù)庫中使用字符映射性別(M ,F(xiàn)),Hibernate提供了AttributeConverter解決上述場景的轉換問題
public enum Gender {
MALE( 'M' ),
FEMALE( 'F' );
private final char code;
Gender(char code) {
this.code = code;
}
public static Gender fromCode(char code) {
if ( code == 'M' || code == 'm' ) {
return MALE;
}
if ( code == 'F' || code == 'f' ) {
return FEMALE;
}
throw new UnsupportedOperationException(
"The code " + code + " is not supported!"
);
}
public char getCode() {
return code;
}
}
User實體類定義如下,重點在 @Convert(converter = GenderConverter.class)注釋
@Entity
@Data
@ToString
@Table(name = "user")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
private String name;
@Convert(converter = GenderConverter.class)
private Gender gender;
}
定義一個GenderConverter的類,需要實現(xiàn)AttributeConverter接口,實現(xiàn)convertToDatabaseColumn和convertToEntityAttribute,作用是分別封裝從實體類映射至數(shù)據(jù)庫字段數(shù)值的邏輯和從數(shù)據(jù)庫字段數(shù)值映射到代碼實體類中的枚舉類值。
public class GenderConverter implements AttributeConverter<Gender,Character> {
@Override
public Character convertToDatabaseColumn(Gender gender) {
if ( gender == null ) {
return null;
}
return gender.getCode();
}
@Override
public Gender convertToEntityAttribute(Character value) {
if ( value == null ) {
return null;
}
return Gender.fromCode( value );
}
}
測試
@SpringBootTest
@Slf4j
public class AttributeConverterTest {
@Resource
private UserRepository userRepository;
@Test
void should_user__when__give_user() {
//given
User user1 = new User(null,"Janny", Gender.FEMALE);
User user2 = new User(null,"Tom", Gender.MALE);
//when
User actUser1 = userRepository.save(user1);
User actUser2 = userRepository.save(user2);
//then
Assertions.assertNotNull(actUser1);
Assertions.assertNotNull(actUser2);
}
}

例外Hibernate也提供其他的方法,如使用@Enumerated注解,詳情可閱讀這篇文檔
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。
相關文章
基于apache poi根據(jù)模板導出excel的實現(xiàn)方法
下面小編就為大家?guī)硪黄赼pache poi根據(jù)模板導出excel的實現(xiàn)方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-06-06
Java 實戰(zhàn)范例之員工管理系統(tǒng)的實現(xiàn)
讀萬卷書不如行萬里路,只學書上的理論是遠遠不夠的,只有在實戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用java+vue+Springboot+ssm+mysql+maven+redis實現(xiàn)一個前后端分離的員工管理系統(tǒng),大家可以在過程中查缺補漏,提升水平2021-11-11
Java連接SQL?Server數(shù)據(jù)庫的超詳細教程
在Java應用程序中我們經(jīng)常需要與數(shù)據(jù)庫進行交互,一種常見的數(shù)據(jù)庫是Microsoft?SQL?Server,下面這篇文章主要給大家介紹了關于Java連接SQL?Server數(shù)據(jù)庫的超詳細教程,需要的朋友可以參考下2024-01-01
Java生成訂單號或唯一id的高并發(fā)方案(4種方法)
本文主要介紹了Java生成訂單號或唯一id的高并發(fā)方案,包括4種方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2024-01-01

