如何在Spring中创建一个ABSTRACT持久层?

时间:2012-04-10 12:55:28

标签: spring jpa architecture persistence abstract

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

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

  • [1]项目(申请负责人; pom)
  • [2]核心模型(这里是jpa注释)
  • [3]核心业务逻辑( - >核心模型)
  • [4] webapp( - >持久性, - >核心业务逻辑)
  • [5]持久性摘要( - >核心模型)
  • [6] persistence impl relational db( - > persistence abstract)
  • [7] persistence impl xml文件( - > persistence abstract)
  • [8]持久性冲击......

我们想要创建一个抽象持久层,它定义了一些用于持久化业务对象的类或抽象服务(接口?)。

在[6]中应该是使用Hibernate / JPA来持久化业务对象的实现。据我所知,Maven可以在其他maven模块中使用JPA注释,这里[2]。此外,我们希望在[7]中有一个实现,它将业务对象持久存储到xml文件或其他源中,以及将来可能存在的任何内容。

您是否知道如何从Web应用程序模块隐藏实际的持久性实现?我需要在[4]和[5]中指定使用这样的架构吗?

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

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

提前谢谢。

1 个答案:

答案 0 :(得分:2)

好的,经过一些阅读和潜入设计模式的世界,我决定做以下事情并分享我的经验(请参阅我的第一篇文章来解析参考文献)。

对于持久层([5],[6],[7]等),我使用了策略模式,但如果你想谷歌它,你也可以称之为DAOFactory-Pattern。与此相关,我使用了GenericDAO-Pattern,这在“使用Hibernate的Java持久性”一书中得到了很好的解释。

策略模式基本上由一个接口组成,在我的例子中称为 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() {

        ...
    }
}

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