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

Java (DataNucleus)JDO-服务/存储库分层和@Transactional,java,persistence,jdo,datanucleus,transactional,Java,Persistence,Jdo,Datanucleus,Transactional,对于个人教育,我目前正在围绕Guice开发一个小应用程序框架,通过Spring等在幕后工作来学习 简介 仅出于上下文的考虑,以下是我到目前为止所拥有的并计划这样做的内容,您会对我试图归档的内容有一种感觉: 上下文(核心) ApplicationContext/-Configuration 模块(自动发现,设置Guice绑定) 扩展 配置:@Config 语言环境:@Locale和i18n服务 资源:@Property,@Resource和一些提供对资源的轻松访问的类 坚持:问题-我们开始了

对于个人教育,我目前正在围绕
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.....
        }
    }    

}
class个人服务{
@事务性(TxType.REQUIRED)
公共集doX(){
//这里调用了多个存储库方法
}
}
类PersonRepository{
私有PersistenceManagerFactory pmf;
公共集doX(){
try(PersistenceManager pm=pmf.getPersistenceManager()){
下午。。。。。
}
}    
}
困难

  • DataNucleus
    支持
    RESOURCE\u LOCAL
    pm.currentTransaction()
    )以及
    JTA
    事务,我希望同时支持这两种事务(用户不必在配置之外区分这两种事务)。无论如何,他都不必担心事务处理,这是注释的方法拦截器的一部分(我猜)
  • 我希望支持可以放在服务层方法上的
    @Transactional
    (来自
    JTA
    )注释。知道注释本身在JDO中不可用,我认为它也可以使用
  • 存储库层应该如何“说话”
    JDO
    ?每个方法是否应该从
    PersistenceManager工厂
    获取一个
    PersistenceManager(代理)
    ,然后将其关闭(如示例中所示),还是应该获得一个
    PersistenceManager
    注入(而不是工厂)?每个方法是否都应该关闭PersistenceManager(在两种情况下)?我想这对
    RESOURCE\u LOCAL
    事务不起作用,因为一个事务绑定到一个
    PersistenceManager
我尝试的

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.....
        }
    }    

}
  • 我有一个
    jtTransactionAlinterceptor
    (使用
    pmf.getPersistenceManagerProxy
    )和一个
    jtTransactionAlinterceptor
    (非常类似于使用
    ThreadLocal
摘要

  • 我知道我的问题可能没有预期的那么清楚,并且混合了服务/存储库层问题(我认为这是我的主要问题)和事务处理问题(我认为,一旦我了解如何在存储库层正确使用PMF/PM,我就可以解决这些问题)
  • 这里没有作用域a
    requestscope
    等。我只希望第一个
    @Transactional
    方法调用是整个事情的起点(这就是问题的关键:这是不可能的,PMF/PM必须在之前确定作用域,我必须将我的想法引导到那个方向吗?)
感谢您的任何澄清/帮助