(DataNucleus)JDO - 服务/存储库分层和@Transactional

时间:2017-08-22 09:47:56

标签: java persistence jdo datanucleus transactional

对于个人教育,我目前正围绕Guice开发一个小应用程序框架,以便了解Spring等在幕后工作的方式。

简介

仅仅为了上下文,这是我到目前为止所做的并计划这样做,你会对我尝试存档的内容有所了解:

上下文(核心)

  • ApplicationContext / -Configuration
  • 模块(自动发现,设置Guice绑定)

扩展

  • 配置:@Config
  • 区域设置:@Locale和i18n服务
  • 资源:@Property@Resource以及一些可轻松访问资源的类
  • 坚持:问题 - 我们走了!

问题

我想将JDO标准(及其参考实现DataNucleus)用于持久层。设置PersistenceManagerFactory很简单,因此以基本方式使用它。然而,我的目标是典型的服务/存储库层架构,例如:

  • PersonRepository(JDO)
  • PersonService(使用PersonRepository进行交易)

仅此一点也不会太难,但只要我尝试将事务正确地整合到概念中,我就会有点迷失。

所需

class PersonService {

   @Transactional(TxType.REQUIRED)
   public Set<Person> doX() {
     // multiple repository methods called here
   }

}

class PersonRepository {

    private PersistenceManagerFactory pmf;

    public Set<Person> doX() {
        try (PersistenceManager pm = pmf.getPersistenceManager()) {
            pm.....
        }
    }    

}

难点

  • DataNucleus支持RESOURCE_LOCALpm.currentTransaction())以及JTA次交易,我也想同时支持这两项交易(用户应必须区分两个外部配置)。他无论如何都不应该为交易处理而烦恼,这是注释方法拦截器的一部分(我猜)。
  • 我很乐意支持可以放在服务层方法上的@Transactional(来自JTA)注释。知道注释在JDO中本身不可用,我认为它也可以使用。
  • 存储库层应该如何“说”JDO?每个方法是否应该从PersistenceManager(Proxy)获得PersistenceManagerFactory并在之后关闭它(如示例中所示)或者注入PersistenceManager(而不是工厂)?每个方法是否应该关闭PersistenceManager(在两种情况下)?我认为这不适用于RESOURCE_LOCAL次交易,因为交易被绑定到一个PersistenceManager

我尝试了什么

摘要

  • 我知道我的问题可能没有那么清晰,并且混合了服务/存储库层问题(我认为这是我的主要问题)和交易内容(一旦我理解了如何正确使用PMF,我就能弄清楚)存储库层中的/ PM我认为)
  • 没有范围àlaRequestScoped等。我只想让第一个@Transactional方法调用成为整个事情的起点(这就是重点:这是不可能的和PMF / PM 之前有作为范围,我必须将我的想法引向这个方向?)

感谢您的任何澄清/帮助!

0 个答案:

没有答案