如何在 JPA 中动态更改 Schema 的名称

Posted

技术标签:

【中文标题】如何在 JPA 中动态更改 Schema 的名称【英文标题】:How can I change the name of the Schema dynamically in JPA 【发布时间】:2019-07-07 23:38:53 【问题描述】:

我正在使用 JPA 查询 flyway_schema_history 以打印已执行迁移的报告。 flyway_schema_history 的结构在我的 Postgresql 数据库中的所有模式中重复。另外,我在运行程序时将架构的名称作为参数传递。我使用的是 Java 10。

我在 JPA 中创建了这个实体。

@Entity
@Table(name = "flyway_schema_history", schema="this_should_be dynamic")
public class FlywaySchemaHistoryGeneric 

    @Id
    @Column(name="installed_rank")
    private Integer installedRank;

    @Column(name="version")
    private String version;

    @Column(name="description")
    private String description;

    @Column(name="type")
    private String type;

    @Column(name="script")
    private String script;

    @Column(name="checksum")
    private Integer checksum;

    @Column(name="installed_by")
    private String installedBy;

    @Column(name="installed_on")
    private Date installedOn;

    @Column(name="execution_time")
    private Integer executionTime;

    @Column(name="success")
    private Boolean success;


    public Integer getInstalledRank() 
        return installedRank;
    

    public void setInstalledRank(Integer installedRank) 
        this.installedRank = installedRank;
    

    public String getVersion() 
        return version;
    

    public void setVersion(String version) 
        this.version = version;
    

    public String getDescription() 
        return description;
    

    public void setDescription(String description) 
        this.description = description;
    

    public String getType() 
        return type;
    

    public void setType(String type) 
        this.type = type;
    

    public String getScript() 
        return script;
    

    public void setScript(String script) 
        this.script = script;
    

    public Integer getChecksum() 
        return checksum;
    

    public void setChecksum(Integer checksum) 
        this.checksum = checksum;
    

    public String getInstalledBy() 
        return installedBy;
    

    public void setInstalledBy(String installedBy) 
        this.installedBy = installedBy;
    

    public Date getInstalledOn() 
        return installedOn;
    

    public void setInstalledOn(Date installedOn) 
        this.installedOn = installedOn;
    

    public Integer getExecutionTime() 
        return executionTime;
    

    public void setExecutionTime(Integer executionTime) 
        this.executionTime = executionTime;
    

    public Boolean getSuccess() 
        return success;
    

    public void setSuccess(Boolean success) 
        this.success = success;
    

我试图使用 FlywaySchemaHistoryGeneric.class.getAnnotation 在运行时更改值但没有成功,但我认为这应该是一种简单的方法。 如何使 @table 中的架构成为动态的?

【问题讨论】:

【参考方案1】:

我猜你不能在运行时修改它,因为注解是只读的。您可以为每个架构创建一个数据源,然后根据您的规则选择其中一个来持久化实体。

【讨论】:

以上是关于如何在 JPA 中动态更改 Schema 的名称的主要内容,如果未能解决你的问题,请参考以下文章

如何在 @Table 注释中动态设置模式名称

如何在spring jpa实体中提及sqlserver数据库名称?

SpringBoot - Flyway - JPA 集成 - 创建名称为“flywayInitializer”的 bean 时出错 - information_schema 中的未知表“事件”

Spring Boot JPA 将模式名称外部化为属性文件

如何在 Laravel 中制作简单的动态下拉列表?

jpa 如何优雅的实现动态sql