1

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

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

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

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

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

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

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

有没有办法使用 [6] 中的 Spring Data JPA 和 [7] 中的其他东西?

先感谢您。

4

1 回答 1

2

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

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

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

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

持久服务:

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() {

        ...
    }
}

在我看来,这些模式非常好。如果你想在这篇文章中添加一些东西,请随意。

于 2012-04-19T12:29:00.297 回答