您好,登錄后才能下訂單哦!
這篇文章給大家介紹怎么在Springboot JPA 中將Enum類型存入到數據庫,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
1、使用JPA 的@Enumerated 注解 ,可以直接將Enum映射到數據庫中。
但是value的值只有兩種方式選擇,一種是使用枚舉的序號映射,一種是枚舉的名稱來映射。
public enum EnumType { /** Persist enumerated type property or field as an integer. */ ORDINAL, /** Persist enumerated type property or field as a string. */ STRING }
如果想存入枚舉中的自定義的值,則需要實現AttributeConverter接口
2、實現AttributeConverter接口方式
/** * @param <DB> : 保存到數據庫的數據類型 * @author peter * date: 2019-05-15 16:57 **/ public interface PersistEnum2DB<DB> { DB getData(); }
import javax.persistence.AttributeConverter; /** * @param <ATTR> 實體類中枚舉的類型,需實現{@link PersistEnum2DB} 接口 * @param <DB> 保存到數據庫的數據類型 * @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() + "】,數據庫庫中的值為:【" + 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); } } }
//支付狀態 @Convert(converter = PayStatus.Converter.class) private PayStatus payStatus;
補充: SpringBoot | Jpa 將Java枚舉映射為基本值類型
使用實體屬性類型轉換器AttributeConverter
在代碼中使用枚舉類來映射用戶性別(如下代碼所示),在數據庫中使用字符映射性別(M ,F),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的類,需要實現AttributeConverter接口,實現convertToDatabaseColumn和convertToEntityAttribute,作用是分別封裝從實體類映射至數據庫字段數值的邏輯和從數據庫字段數值映射到代碼實體類中的枚舉類值。
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); } }
關于怎么在Springboot JPA 中將Enum類型存入到數據庫就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。