【问题标题】:How to set annotation attribute value based on the active profile in Spring Boot?如何根据 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;        
}

【问题讨论】:

    标签: java postgresql spring-boot jpa h2


    【解决方案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 不会编译说“属性值必须是常量”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-12
    • 2016-10-08
    • 1970-01-01
    • 2016-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多