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);
    }
}

 

 

例外Hibernate也提供其他的方法,如使用@Enumerated注解,詳情可閱讀下面文檔

文檔:https://docs.jboss.org/hibernate/stable/orm/userguide/html_single/Hibernate_User_Guide.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM