Java 如何根据Spring Boot中的活动配置文件设置注释属性值?

Java 如何根据Spring Boot中的活动配置文件设置注释属性值?,java,postgresql,spring-boot,jpa,h2,Java,Postgresql,Spring Boot,Jpa,H2,我在Spring Boot应用程序中使用了两种镜像数据库模式,并在启动时进行Flyway迁移:内存中的H2-用于demo配置文件,以及Postgres-用于prod。在每个模式中,都有一个reset_token字段,其定义如下: @Value("${tokenType}") // will take the value from active profile private final String tokenType = "char"; @Column

我在Spring Boot应用程序中使用了两种镜像数据库模式,并在启动时进行Flyway迁移:内存中的H2-用于
demo
配置文件,以及Postgres-用于
prod
。在每个模式中,都有一个
reset_token
字段,其定义如下:

@Value("${tokenType}") // will take the value from active profile
private final String tokenType = "char";

@Column(columnDefinition = tokenType)
private final String resetToken;
创建表用户(
... 
重置令牌字符(36)
);
问题是Hibernate希望使用两种不同的注释将my
User
实体中的字符串属性正确映射到相应的表列中:
@column(columnDefinition=“char”)
-forH2
@column(columnDefinition=“bpchar”)
-forPostgres。我该怎么做?我的意思是,是否可以根据活动配置文件设置
columnDefinition
属性的值,以便不为每个配置文件创建两个不同的
User
实体

@数据
@NoArgsConstructor(access=AccessLevel.PRIVATE,force=true)
@所需参数构造函数
@实体
@表(name=“users”)
公共类用户{
...
@列(columnDefinition=“char”)
//@Column(columnDefinition=“bpchar”)
私有最终字符串重置令牌;
}

我认为您不需要columnDefinition,只需在注释中使用@Column

即可使用final var。因此,您需要添加一个final变量来保存您的令牌类型。此变量将从活动配置文件中填充。 您可以使用以下内容:

@Value("${tokenType}") // will take the value from active profile
private final String tokenType = "char";

@Column(columnDefinition = tokenType)
private final String resetToken;

您可以尝试粘贴到
@列(columnDefinition=“bpchar”)
并附加
;MODE=PostgreSQL
到H2 JDBC连接字符串

如果那不起作用,也许


如果这也不起作用,那么我建议在它下面给出答案。

不,它不起作用。org.hibernate.tool.schema.spi.SchemaManagementException:架构验证:在表[users]的[reset_token]列中遇到错误的列类型;已找到[char(Types#char)],但应为[varchar(255)(Types#varchar)抱歉,我无法在Alluntute上帮助您,因为
@Value
无法使用
final
变量,因此
令牌类型
在初始化后会保留其
的“char”
值,并且不想更改它。如果我删除它,请删除它“char”并保持tokenType未赋值,则@Column不会编译,并说“属性值必须是常量”“。实际上,我已经将
CHAR
替换为
VARCHAR
,这不会导致不同RDBMS之间存在任何差异,实际上根本不需要
@Column
注释来进行正确映射。但无论如何,感谢您的建议。”。