R2DBC spring postgres enum mapping



我是春季r2dbc的新手。以前我有用户休眠。在休眠中,当您需要将postgresql枚举映射到java枚举时,您只需添加com.vladmihalcea:hibernate-types-52并使用@Enumerated(如下面所示(。与R2DBC和枚举(PostgreSQL(相关,所以问题我必须为每个枚举创建编解码器。是否有可能通过某种标签或其他通用解决方案来实现这一点,而不仅仅是创建多个编解码器。

CREATE TYPE user_type_enum AS ENUM ('ADMIN', 'USER');
public class PostgreSQLEnumType extends org.hibernate.type.EnumType {
public void nullSafeSet(PreparedStatement st, Object value,
int index, SharedSessionContractImplementor session)
throws HibernateException, SQLException {
st.setObject(
index,
value != null ? ((Enum) value).name() : null,
Types.OTHER
);
}
}
public enum UserTypeEnum {
ADMIN,
USER
}
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import org.springframework.data.annotation.Id
import org.springframework.data.relational.core.mapping.Table;
import org.hibernate.annotations.Type;
import org.hibernate.annotations.TypeDef;
@Table;
@TypeDef(
name = "pgsql_enum",
typeClass = PostgreSQLEnumType.class
)
public class User {
@Id
private Long id;
private String usename;
@Enumerated(EnumType.STRING)
@Type(type = "pgsql_enum")
private UserEnumType userType;
// Getters and setters provided
}

您不再需要创建自己的编解码器。 见 https://github.com/pgjdbc/r2dbc-postgresql#postgres-enum-types

DDL:

CREATE TYPE my_enum AS ENUM ('FIRST', 'SECOND');

Java 枚举类:

enum MyEnumType {
FIRST, SECOND;
}

您的 R2DBC ConnectionFactory bean:

PostgresqlConnectionConfiguration.builder()
.codecRegistrar(EnumCodec.builder()
.withEnum("my_enum",MyEnumType.class)
.build());

请注意,您必须在withEnum中使用小写字母作为"my_enum",否则将不起作用。

此外,您需要提供一个扩展 EnumWriteSupport 的转换器,并注册它。 请参阅:https://docs.spring.io/spring-data/r2dbc/docs/current/reference/html/#mapping.explicit.enum.converters

例如:

@Configuration
public static class R2DBCConfiguration extends AbstractR2dbcConfiguration {
@Override
@Bean
public ConnectionFactory connectionFactory() {
...
}
@Override
protected List<Object> getCustomConverters() {
return List.of(
new MyEnumTypeConverter()
);
}
}

最新更新