JPA Entity的(json)字符串字段自动转为java类

2023-12-25  本文已影响0人  饱饱想要的灵感

一、AttributeConverter

要实现自动转换,须先了解AttributeConverter,JPA中的AttributeConverter接口允许你定义属性在数据库和实体间如何转换。你可以用它将JSON字符串转换为Java对象。以下是一个示例:

首先,定义你的Java类。这里假设我们有一个名为User的类:

public class User {
    private String name;
    private String email;

    // getters and setters
}

然后,创建一个AttributeConverter将User对象转换为JSON字符串。在这个例子中,我们使用了Jackson的ObjectMapper:

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;

import javax.persistence.AttributeConverter;
import java.io.IOException;

public class UserConverter implements AttributeConverter<User, String> {

    ObjectMapper objectMapper = new ObjectMapper();

    @Override
    public String convertToDatabaseColumn(User user) {
        try {
            return objectMapper.writeValueAsString(user);
        } catch (JsonProcessingException e) {
            throw new RuntimeException("Error while serializing User to json", e);
        }
    }

    @Override
    public User convertToEntityAttribute(String userJson) {
        try {
            return objectMapper.readValue(userJson, User.class);
        } catch (IOException e) {
            throw new RuntimeException("Error while deserializing User from json", e);
        }
    }
}

此后,你可以在你的实体类中使用这个转换器。例如,如果你有一个实体类包含了一个User对象,你可以这样使用这个转换器:

@Entity
public class MyEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Convert(converter = UserConverter.class)
    private User user;

    // other fields, getters and setters
}

这样,每次你从数据库获取MyEntity时,JPA将自动使用我们定义的UserConverter将JSON字符串转换为User对象。同样,每次你保存MyEntity到数据库时,User对象将被转换为JSON字符串。

注意,使用AttributeConverter可能会影响应用程序的性能,因为每次访问属性时都会进行转换。在某些情况下,你可能需要考虑其他方法,例如使用数据库本身的JSON支持。

二、autoApply全局自动转换

另外还可以添加@Converter(autoApply = true)全局自动转换, 避免在每一个Entity类中显式指定转换器, 下面是一个简单的例子,假设我们有一个枚举类:

public enum Status {
    ACTIVE, INACTIVE;
}

在数据库中我们想用整数来表示(例如:ACTIVE为1,INACTIVE为0),这时我们就可以创建一个实现了AttributeConverter接口的类来处理这个转换:

import javax.persistence.AttributeConverter;
import javax.persistence.Converter;

@Converter(autoApply = true)
public class StatusConverter implements AttributeConverter<Status, Integer> {

    @Override
    public Integer convertToDatabaseColumn(Status attribute) {
        if (attribute == null) {
            return null;
        }
        switch (attribute) {
            case ACTIVE:
                return 1;

            case INACTIVE:
                return 0;
            
            default:
                throw new IllegalArgumentException(attribute + " not supported.");
        }
    }

    @Override
    public Status convertToEntityAttribute(Integer dbData) {
        if (dbData == null) {
            return null;
        }
        switch (dbData) {
            case 1:
                return Status.ACTIVE;

            case 0:
                return Status.INACTIVE;

            default:
                throw new IllegalArgumentException(dbData + " not supported.");
        }
    }
}

在这个例子中,当我们在实体类中使用Status类型的时候,由于@Converter(autoApply = true)的存在, JPA会自动使用我们定义的StatusConverter将其转换为对应的数据库值。

三、@Enumerated和AttributeConverter的区别

@EnumeratedAttributeConverter都是在JPA(Java Persistence API)中用于数据转换的工具,但他们之间使用的上下文和方法是不同的。

所以说,@EnumeratedAttributeConverter的共同点是都可以在JPA中用于数据的转换,但AttributeConverter更加通用和灵活,能处理更多的情况。至于使用哪一个,主要取决于你的具体需求。

上一篇 下一篇

猜你喜欢

热点阅读