如何根据 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 以编程方式确定当前的活动配置文件 [重复]

当多个配置文件不活动时如何有条件地声明 Bean?

如何访问@JmsListener使用的Spring Boot中的活动JMS连接/会话

Spring Boot / JPA / Hibernate,如何根据 Spring 配置文件切换数据库供应商?

使用 maven 插件设置时 Spring Boot 配置文件不活动