中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么在Springboot JPA 中將Enum類型存入到數據庫

發布時間:2021-01-30 14:10:30 來源:億速云 閱讀:638 作者:Leah 欄目:開發技術

這篇文章給大家介紹怎么在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類型存入到數據庫

關于怎么在Springboot JPA 中將Enum類型存入到數據庫就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

蕲春县| 普陀区| 军事| 淮北市| 连云港市| 乐昌市| 马鞍山市| 肥东县| 岳普湖县| 开远市| 利辛县| 建湖县| 浠水县| 定襄县| 天门市| 漾濞| 吉安市| 波密县| 丰台区| 西峡县| 西安市| 彭水| 综艺| 惠安县| 泗洪县| 平江县| 湘潭市| 保德县| 农安县| 静海县| 津南区| 天水市| 黑山县| 定襄县| 本溪市| 伊宁县| 巧家县| 惠安县| 镇宁| 定南县| 双城市|