Springboot JPA 枚舉Enum類型存入到數(shù)據(jù)庫(kù)的操作
1、使用JPA 的@Enumerated 注解 ,可以直接將Enum映射到數(shù)據(jù)庫(kù)中。
但是value的值只有兩種方式選擇,一種是使用枚舉的序號(hào)映射,一種是枚舉的名稱來(lái)映射。
public enum EnumType { /** Persist enumerated type property or field as an integer. */ ORDINAL, /** Persist enumerated type property or field as a string. */ STRING}
如果想存入枚舉中的自定義的值,則需要實(shí)現(xiàn)AttributeConverter接口
2、實(shí)現(xiàn)AttributeConverter接口方式
/** * @param <DB> : 保存到數(shù)據(jù)庫(kù)的數(shù)據(jù)類型 * @author peter * date: 2019-05-15 16:57 **/public interface PersistEnum2DB<DB> { DB getData();}
import javax.persistence.AttributeConverter;/** * @param <ATTR> 實(shí)體類中枚舉的類型,需實(shí)現(xiàn){@link PersistEnum2DB} 接口 * @param <DB> 保存到數(shù)據(jù)庫(kù)的數(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('枚舉轉(zhuǎn)化異常。枚舉【' + clazz.getSimpleName() + '】,數(shù)據(jù)庫(kù)庫(kù)中的值為:【' + 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;
補(bǔ)充: SpringBoot | Jpa 將Java枚舉映射為基本值類型
解決方法之一:使用實(shí)體屬性類型轉(zhuǎn)換器AttributeConverter
場(chǎng)景假設(shè):在代碼中使用枚舉類來(lái)映射用戶性別(如下代碼所示),在數(shù)據(jù)庫(kù)中使用字符映射性別(M ,F(xiàn)),Hibernate提供了AttributeConverter解決上述場(chǎng)景的轉(zhuǎn)換問(wèn)題
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實(shí)體類定義如下,重點(diǎn)在 @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;}
定義一個(gè)GenderConverter的類,需要實(shí)現(xiàn)AttributeConverter接口,實(shí)現(xiàn)convertToDatabaseColumn和convertToEntityAttribute,作用是分別封裝從實(shí)體類映射至數(shù)據(jù)庫(kù)字段數(shù)值的邏輯和從數(shù)據(jù)庫(kù)字段數(shù)值映射到代碼實(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 ); }}測(cè)試
@SpringBootTest@Slf4jpublic 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注解,詳情可閱讀這篇文檔
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持好吧啦網(wǎng)。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。
相關(guān)文章:
1. .Net Core和RabbitMQ限制循環(huán)消費(fèi)的方法2. jsp網(wǎng)頁(yè)實(shí)現(xiàn)貪吃蛇小游戲3. asp(vbs)Rs.Open和Conn.Execute的詳解和區(qū)別及&H0001的說(shuō)明4. ASP.NET MVC遍歷驗(yàn)證ModelState的錯(cuò)誤信息5. 用css截取字符的幾種方法詳解(css排版隱藏溢出文本)6. ASP 信息提示函數(shù)并作返回或者轉(zhuǎn)向7. asp中response.write("中文")或者js中文亂碼問(wèn)題8. PHP設(shè)計(jì)模式中工廠模式深入詳解9. CSS hack用法案例詳解10. 將properties文件的配置設(shè)置為整個(gè)Web應(yīng)用的全局變量實(shí)現(xiàn)方法
