Java 如何根据Spring Boot中的活动配置文件设置注释属性值?
我在Spring Boot应用程序中使用了两种镜像数据库模式,并在启动时进行Flyway迁移:内存中的H2-用于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
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希望使用两种不同的注释将myUser
实体中的字符串属性正确映射到相应的表列中:@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
注释来进行正确映射。但无论如何,感谢您的建议。”。