Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Spring中创建抽象持久层?_Spring_Jpa_Architecture_Persistence_Abstract - Fatal编程技术网

如何在Spring中创建抽象持久层?

如何在Spring中创建抽象持久层?,spring,jpa,architecture,persistence,abstract,Spring,Jpa,Architecture,Persistence,Abstract,我需要一些帮助与这个设计问题,我在春天。我必须说我是一个新手春天和冬眠,JPA等 我们正在创建一个基于Spring的web应用程序,它被分为不同的Maven模块。模块为(小箭头'->'表示“参考”): [1] 项目(应用程序负责人;pom) [2] 核心模型(此处为jpa注释) [3] 核心业务逻辑(->核心模型) [4] webapp(->持久性,-->核心业务逻辑) [5] 持久性抽象(->核心模型) [6] 持久化impl关系数据库(->持久化抽象) [7] 持久性impl xml文件(

我需要一些帮助与这个设计问题,我在春天。我必须说我是一个新手春天和冬眠,JPA等

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

  • [1] 项目(应用程序负责人;pom)
  • [2] 核心模型(此处为jpa注释)
  • [3] 核心业务逻辑(->核心模型)
  • [4] webapp(->持久性,-->核心业务逻辑)
  • [5] 持久性抽象(->核心模型)
  • [6] 持久化impl关系数据库(->持久化抽象)
  • [7] 持久性impl xml文件(->持久性摘要)
  • [8] 持久性意味着
通过[5],我们希望创建一个抽象持久层,该层定义了一些用于持久化业务对象的类或抽象服务(接口?)

[6]中应该是使用Hibernate/JPA来持久化业务对象的实现。据我所知,Maven可以在另一个Maven模块中使用JPA注释,这里是[2]。此外,我们希望在[7]中有一个实现,可以将业务对象持久化到xml文件或其他源文件中,无论将来是什么

您知道如何对web应用程序模块隐藏实际的持久性实现吗?要使用这样的体系结构,我必须在[4]和[5]中指定什么

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

有没有一种方法可以使用[6]中的Spring数据JPA和[7]中的其他内容


提前谢谢。

好的,在阅读了一点设计模式并深入了解了设计模式之后,我决定做以下工作并分享我的经验(请参阅我的第一篇文章以了解参考资料)

对于持久层([5]、[6]、[7]等等),我使用了策略模式,但是如果您想用谷歌搜索它,也可以调用它。与此相关,我使用了,这在《Java持久化与Hibernate》一书中有很好的解释

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

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)等实现了这个接口,我将它们声明为Springbean。我还将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>

在我看来,这些图案很好看。如果您想在此帖子中添加内容,请随意。

我不太了解PersistenceService的用法PersistenceService的优点是有一个中心对象来获取persistenceStrategy对象。但你是对的。我想您也可以将“hibernatePersistenceStrategy”Bean重命名为“persistenceStrategy”,并在需要的地方@Autowire它,并以这种方式对实际实现保持“抽象”。
<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>
@Controller
public class NewDatasetController {

    @Autowired
    PersistenceStrategy persistenceStrategy;

    @RequestMapping("/")
    public String landing() {

        ...
    }
}