首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >数据模式的Java ORM / OGM / Persistence框架在运行时之前是未知的?

数据模式的Java ORM / OGM / Persistence框架在运行时之前是未知的?
EN

Stack Overflow用户
提问于 2018-08-30 05:52:26
回答 1查看 0关注 0票数 0

我有一个设计/架构问题,正在用Java 开发一个ETL应用程序(我相对缺乏经验)。我正在利用Spring Boot作为组件自动装配,依赖注入等的基础框架。我的应用程序旨在以批处理方式按计划运行。(仅供参考我看过Spring Batch,但它没有达到我需要的水平)。为了最大限度地提高灵活性,在执行应用程序时,它会在运行时读取用户/开发人员定义的JSON配置文件。这称为“作业配置”。作业配置文件包含一个或多个数据源的数组,用于从中提取数据,每个数据源配置定义要提取的数据的特定查询(以及各种其他参数)。这些数据源配置中的每一个还定义了变换数组,其定义了如何将提取的数据转换为期望的数据结构。最后,配置定义了一个输出数据源数组,这是数据在加入(如果需要)并合并到其最终输出结构后加载的位置。

我需要帮助的部分挑战是,作为开发人员,我不知道最终输出结构的结构是什么,因为它是配置的,而不是硬编码的。所以我不能在一些预定义的POJO / DOA中使用像Hibernate这样的ORM框架来帮助我避免编写一堆我自己的复杂持久性逻辑。有没有人知道现有的设计模式,或者可能是一个框架来帮助解决这些挑战?

EN

回答 1

Stack Overflow用户

发布于 2018-08-30 15:38:52

动态切换数据源

这可以通过将弹簧范围与工厂bean一起使用来完成:

代码语言:javascript
复制
<bean id="jobScope" class="com.yourapp.scope.JobScope"/>

<bean class="org.springframework.beans.factory.config.CustomScopeConfigurer">
    <property name="scopes">
        <map>
            <entry key="job" value-ref="jobScope"/> 
        </map>
    </property>
</bean>

<bean id="job" class="com.youapp.JobFactory" scope="job">
    <aop:scoped-proxy/>
</bean>

<bean id="dataSourceFactory" class="com.yourapp.db.JobDataSourceFactory"
      scope="singleton" destroy-method="close">
    <property name="job" ref="job"/>
</bean>

<bean id="dataSource" factory-bean="dataSourceFactory" factory-method="getObject"
      destroy-method="close" scope="job" >
    <aop:scoped-proxy/>
</bean>

生成/执行选择查询

可能不会有很多类型的查询,猜想select $columns from $tableselect $columns from $table where id = $id

任何基于作业配置生成字符串的方法都可以

mybatis中的速度模板可能有助于此,或者可以手动执行此操作。以下是使用velocity在mybatis中查询的外观示例:

代码语言:javascript
复制
<select id="selectData" resultType="hashmap">
  SELECT 
    #foreach($name in $_parameter.columns)
        $name
        #if( $foreach.hasNext ), #end
    #end
  FROM $table
</select>

如果你在java中生成查询片段mybatis mapper可能如下所示:

代码语言:javascript
复制
@Select("SELECT $columns FROM $table")
})
List<Map<String, Object>> selectData(@Param("columns") String columns, @Param("table") String table);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100002499

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档