【问题标题】:How to create an ABSTRACT persistence layer in Spring?如何在 Spring 中创建 ABSTRACT 持久层?
【发布时间】:2012-04-10 12:55:28
【问题描述】:

我需要一些帮助来解决我在 Spring 中遇到的这个设计问题。我必须说我是 Spring 和 Hibernate、JPA 等的新手。

我们正在创建一个基于 Spring 的 Web 应用程序,它被分成不同的 Maven 模块。模块是(小箭头'->'表示“参考”):

  • [1] 项目(应用程序的负责人;pom)
  • [2] 核心模型(此处为 jpa 注释)
  • [3]核心业务逻辑(->核心模型)
  • [4] webapp(-> 持久化,-> 核心业务逻辑)
  • [5] 持久性抽象(-> 核心模型)
  • [6]persistence impl 关系数据库(->persistence abstract)
  • [7]持久化impl xml文件(->持久化摘要)
  • [8] 持久化实现 ...

通过 [5],我们希望创建一个抽象持久层,定义一些类或抽象服务(接口?)以持久化业务对象。

在 [6] 中应该是使用 Hibernate/JPA 来持久化业务对象的实现。据我了解 Maven,可以在此处 [2] 的其他 Maven 模块中使用 JPA 注释。此外,我们希望在 [7] 中实现将业务对象持久保存到 xml 文件或其他源中,无论它未来可能是什么。

您知道如何在 Web 应用模块中隐藏实际的持久性实现吗?我必须在 [4] 和 [5] 中指定什么才能使用这样的架构?

我们的目的是让 web 应用程序模块只知道抽象持久性模块,并在那里有一个配置文件,该文件决定要使用的实际持久性类型或存储源。

有没有办法在 [6] 中使用 Spring Data JPA 以及在 [7] 中使用其他东西?

提前谢谢你。

【问题讨论】:

    标签: spring jpa architecture persistence abstract


    【解决方案1】:

    好的,在阅读并深入了解设计模式世界后,我决定做以下事情并分享我的经验(请参阅我的第一篇文章以解决参考问题)。

    对于持久层([5]、[6]、[7] 等),我使用了 Strategy-Pattern,但如果您想在 Google 上搜索,也可以将其命名为 DAOFactory-Pattern。与此相关,我使用了GenericDAO-Pattern,这在“Java Persistence with Hibernate”一书中得到了很好的解释。

    策略模式基本上由一个接口组成,在我的例子中称为PersistenceStrategy,抽象了实际的持久性实现。此外,我还有一个服务 PersistenceService 包装了该持久性策略。

    public interface PersistenceStrategy {
        public void persist(BaseEntity object);
        ...
    }
    

    PersistenceService:

    public class PersistenceService {
    
        private PersistenceStrategy persistenceStrategy;
    
        public void setPersistenceStrategy(PersistenceStrategy strategy) {
            this.persistenceStrategy = strategy;
        }
    
        public PersistenceStrategy getPersistenceStrategy() {
            return this.persistenceStrategy;
        }
    }
    

    实际的持久性类 [6] 和 [7](例如 PersistenceStrategyHibernate)等实现了这个接口,我将它们声明为 Spring bean。我还将 PersistenceService 声明为 bean。实际的 PersistenceStrategy 是将它们注入 PersistenceService。请注意,这个 bean 定义在 [5] 和 [6] 中的实际持久性实现中,而不是在 webapp 项目 [4] 中。

    <bean id="hibernatePersistenceStrategy" class="org.myProject.persistence.relational.HibernatePersistenceStrategy" />
    
    <!-- PersistenceService is instantiated here with the actual persistence strategy implementation -->
    <bean id="persistenceService" class="org.myProject.persistence.PersistenceService">
        <property name="persistenceStrategy" ref="hibernatePersistenceStrategy"></property>
    </bean>
    

    在我的 webapp maven 项目 [4] 中,我参考了实际的持久性实现,例如[5] 或 [6]。

    <dependency>
        <groupId>org.myProject</groupId>
        <!-- this is where the persistence module is referenced. 
            if you want to change the type of persistence you can do it here. -->
            <artifactId>persistence-relational</artifactId>
            <version>0.0.1-SNAPSHOT</version>
    </dependency>
    

    然后我可以在我的控制器类中引用 PersistenceService 和 PersistenceStrategy。

    @Controller
    public class NewDatasetController {
    
        @Autowired
        PersistenceStrategy persistenceStrategy;
    
        @RequestMapping("/")
        public String landing() {
    
            ...
        }
    }
    

    在我看来,这些模式非常好。如果您想在这篇文章中添加一些内容,请随时。

    【讨论】:

    • 我不太了解 PersistenceService 的用法
    • PersistenceService 的优点是有一个中心对象来获取persistenceStrategy-object。但你是对的。我想您也可以将 'hibernatePersistenceStrategy'-Bean 重命名为 'persistenceStrategy' 并在需要的地方 @Autowire 并以这种方式对实际实现保持“抽象”。
    猜你喜欢
    • 2019-10-27
    • 2011-03-09
    • 2012-04-05
    • 2022-12-15
    • 2011-04-21
    • 1970-01-01
    • 2017-02-04
    • 1970-01-01
    • 2011-07-14
    相关资源
    最近更新 更多