对于个人教育,我目前正围绕Guice
开发一个小应用程序框架,以便了解Spring
等在幕后工作的方式。
仅仅为了上下文,这是我到目前为止所做的并计划这样做,你会对我尝试存档的内容有所了解:
上下文(核心)
Guice
绑定)扩展
@Config
@Locale
和i18n服务@Property
,@Resource
以及一些可轻松访问资源的类我想将JDO标准(及其参考实现DataNucleus
)用于持久层。设置PersistenceManagerFactory
很简单,因此以基本方式使用它。然而,我的目标是典型的服务/存储库层架构,例如:
仅此一点也不会太难,但只要我尝试将事务正确地整合到概念中,我就会有点迷失。
所需
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_LOCAL
(pm.currentTransaction()
)以及JTA
次交易,我也想同时支持这两项交易(用户应不必须区分两个外部配置)。他无论如何都不应该为交易处理而烦恼,这是注释方法拦截器的一部分(我猜)。@Transactional
(来自JTA
)注释。知道注释在JDO中本身不可用,我认为它也可以使用。JDO
?每个方法是否应该从PersistenceManager(Proxy)
获得PersistenceManagerFactory
并在之后关闭它(如示例中所示)或者注入PersistenceManager
(而不是工厂)?每个方法是否应该关闭PersistenceManager
(在两种情况下)?我认为这不适用于RESOURCE_LOCAL
次交易,因为交易被绑定到一个PersistenceManager
。我尝试了什么
JDOTransactionalInterceptor
(使用pmf.getPersistenceManagerProxy
)和JTATransactionalInterceptor
(非常类似于https://github.com/HubSpot/guice-transactional/blob/master/src/main/java/com/hubspot/guice/transactional/impl/TransactionalInterceptor.java使用ThreadLocal
)摘要
RequestScoped
等。我只想让第一个@Transactional
方法调用成为整个事情的起点(这就是重点:这是不可能的和PMF / PM 之前有作为范围,我必须将我的想法引向这个方向?)感谢您的任何澄清/帮助!