【问题标题】:How to add missing columns in a multi-schema based multi-tenant web app using eclipselink如何使用 eclipselink 在基于多模式的多租户 Web 应用程序中添加缺失的列
【发布时间】:2023-03-16 13:43:01
【问题描述】:

我正在使用 java、jpa(eclipselink)、mysql 开发具有“共享数据库/单独模式”方法的多租户 Web 应用程序。我的持久性文件如下所示:

    <persistence-unit name="GroupBuilderPU" transaction-type="RESOURCE_LOCAL">
    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
            <exclude-unlisted-classes>false</exclude-unlisted-classes>
            <properties>
                <property name="eclipselink.cache.shared.default" value="false"/>
                <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/?"/>
                <property name="eclipselink.ddl-generation" value="create-or-extend-tables"/>
<--- Here goes other properties definition -->
        </persistence-unit>

现在这里是我的 EntityMangerFactory 和 EntityManager:

emfForTenant = Persistence.createEntityManagerFactory("GroupBuilderPU");
EntityManager em = emfForTenant.createEntityManager();
        em.setProperty("eclipselink.tenant-id", schemaNameAsTenantId);

它工作正常,直到我在任何实体中添加任何新的持久性列。

就像我有一个实体 UserAccount,我在其中添加了一个新列“字符串出租信息”:

@Entity
@Multitenant(MultitenantType.TABLE_PER_TENANT)
@TenantTableDiscriminator(type = TenantTableDiscriminatorType.SCHEMA, contextProperty = PersistenceUnitProperties.MULTITENANT_PROPERTY_DEFAULT)
public class UserAccount implements Serializable {
...
private String rentalinfo;//Newly added column
...
}

此后,以下行给出错误:

em.createQuery("SELECT ua FROM UserAccount ua").getResultList();

错误是:

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 'RENTALINFO' in 'field list'

那么在这种方法中添加新列(扩展表)的解决方案是什么?

【问题讨论】:

    标签: java jpa eclipselink multi-tenant


    【解决方案1】:

    您收到此异常是因为您的 UserAccount 表中不存在 'RENTALINFO' 列。在正常情况下,设置"create-or-extend-tables" 将使EclipseLink 向现有表发出ALTER,添加新列。但是,MultitenantType.TABLE_PER_TENANT 似乎不支持 ddl 生成:https://wiki.eclipse.org/EclipseLink/DesignDocs/Multi-Tenancy/TablePerTenant

    不支持:

    1. 不支持架构生成,因为它需要了解所有租户(架构),此外,如果使用每个租户的架构级别表,则必须在创建表后设置访问权限。

    所以没有ALTER 并且您的表没有该列。

    附带说明,您可以使用以下持久性属性打开 EclipseLink SQL 日志记录:

    <properties>
        <property name="eclipselink.logging.level" value="ALL"/>
        <property name="eclipselink.logging.level.sql" value="FINE"/>
        <property name="eclipselink.logging.parameters" value="true"/>
    </properties>
    

    通过这种方式,您可以查看 EclipseLink 正在(或在本例中未)执行的查询。

    【讨论】:

    • 是的,我知道 MultitenantType.Table_PER_TENANT 不支持 ddl 生成。顺便说一句,解决方案是使用任何数据库迁移工具,如 flyway、liquibase 等。我使用 flyway 作为解决方案:)
    • @FarhanNazmul 啊,我曾假设您正在寻找涉及 EclipseLink 为您扩展表的解决方案......那么是的,解决方案就是自己扩展表或使用工具。 .. 很高兴你成功了。
    猜你喜欢
    • 2020-08-01
    • 1970-01-01
    • 2017-11-15
    • 1970-01-01
    • 2020-02-02
    • 1970-01-01
    • 2021-05-05
    • 2012-07-24
    • 2018-02-20
    相关资源
    最近更新 更多