如何根据 Spring Boot 中的活动配置文件设置注释属性值?
Posted
技术标签:
【中文标题】如何根据 Spring Boot 中的活动配置文件设置注释属性值?【英文标题】:How to set annotation attribute value based on the active profile in Spring Boot? 【发布时间】:2020-12-23 10:24:49 【问题描述】:我在 Spring Boot 应用程序中使用两个镜像数据库模式,并在启动时进行 Flyway 迁移:内存中 H2 - 用于 demo
配置文件,Postgres - 用于prod
。在每个模式中,都有一个 reset_token
字段,其定义如下:
CREATE TABLE users(
...
reset_token CHAR(36)
);
问题在于 Hibernate 期望使用两个不同的注释将我的 User
实体中的字符串属性正确映射到相应的表列:@Column(columnDefinition = "char")
- 用于 H2 和 @Column(columnDefinition = "bpchar")
- Postgres。我怎样才能做到这一点?我的意思是,是否可以根据活动配置文件设置columnDefinition
属性的值,以便不为每个配置文件创建两个不同的User
实体?
@Data
@NoArgsConstructor(access = AccessLevel.PRIVATE, force = true)
@RequiredArgsConstructor
@Entity
@Table(name = "users")
public class User
...
@Column(columnDefinition = "char")
// @Column(columnDefinition = "bpchar")
private final String resetToken;
【问题讨论】:
【参考方案1】:您可以尝试使用 @Column(columnDefinition = "bpchar")
并将 ;MODE=PostgreSQL
附加到 H2 JDBC 连接字符串。
如果这不起作用,也许是this answer will help。
如果 that 也不起作用,那么我会在其下方提出答案。
【讨论】:
实际上,我已经切换到用VARCHAR
替换CHAR
,这不会导致不同RDBMS 之间存在任何差异,实际上根本不需要@Column
注释来正确映射。不过还是谢谢你的建议。【参考方案2】:
我认为您不需要 columnDefinition,只需使用 @Column
【讨论】:
没有。它不工作。 org.hibernate.tool.schema.spi.SchemaManagementException: Schema-validation: 在表 [users] 的列 [reset_token] 中遇到错误的列类型;找到 [char (Types#CHAR)],但期待 [varchar(255) (Types#VARCHAR) 对不起,我帮不了你【参考方案3】:在注解中你可以使用final var。所以你需要添加一个最终变量来保存你的 tokenType。此 var 将从活动配置文件中填充。 你可以使用这样的东西:
@Value("$tokenType") // will take the value from active profile
private final String tokenType = "char";
@Column(columnDefinition = tokenType)
private final String resetToken;
【讨论】:
不幸的是,@Value
不能与 final
变量一起使用,因此 tokenType
在初始化后立即保留其 "char"
值并且不想更改它。
比 remove="char"
如果我删除“char”并保留 tokenType 未分配,那么@Column 不会编译说“属性值必须是常量”。以上是关于如何根据 Spring Boot 中的活动配置文件设置注释属性值?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Spring Boot 以编程方式确定当前的活动配置文件 [重复]
如何使用 Spring Boot 以编程方式确定当前的活动配置文件 [重复]
如何访问@JmsListener使用的Spring Boot中的活动JMS连接/会话