我正在尝试手动连接Spring Data JPA对象,以便我可以生成DAO代理(也称为存储库) - 而无需使用Spring bean容器.
不可避免地,我会被问到为什么要这样做:这是因为我们的项目已经在使用Google Guice(并且在使用Gin和GWT的UI上),我们不想维护另一个IoC容器配置,或者拉入所有产生的依赖关系.我知道我们可以使用Guice SpringIntegration
,但这是最后的选择.
似乎所有东西都可用于手动连接对象,但由于它没有很好地记录,我现在遇到了困难.
根据Spring Data用户指南,可以单独使用存储库工厂.不幸的是,该示例显示了RepositoryFactorySupport
哪个是抽象类.经过一番搜索,我找到了JpaRepositoryFactory
JpaRepositoryFactory
实际上工作得很好,除了它不会自动创建交易.必须手动管理事务,否则任何内容都不会持久保存到数据库:
entityManager.getTransaction().begin();
repositoryInstance.save(someJpaObject);
entityManager.getTransaction().commit();
Run Code Online (Sandbox Code Playgroud)
问题原来是@Transactional
注释没有自动使用,需要一个帮助TransactionInterceptor
值得庆幸的是,JpaRepositoryFactory
在返回之前,可以进行回调以向生成的Repository代理添加更多AOP建议:
final JpaTransactionManager xactManager = new JpaTransactionManager(emf);
final JpaRepositoryFactory factory = new JpaRepositoryFactory(emf.createEntityManager());
factory.addRepositoryProxyPostProcessor(new RepositoryProxyPostProcessor() {
@Override
public void postProcess(ProxyFactory factory) {
factory.addAdvice(new TransactionInterceptor(xactManager, new AnnotationTransactionAttributeSource()));
}
});
Run Code Online (Sandbox Code Playgroud)
这是事情进展不顺利的地方.单步执行代码中的调试器,TransactionInterceptor
确实创建了一个事务 - 但错误EntityManager
.Spring EntityManager
通过查看当前正在执行的线程来管理活动.这样TransactionInterceptor
做并看到EntityManager
线程没有活动绑定,并决定创建一个新线程.
但是,这个new EntityManager
与创建并传递给JpaRepositoryFactory
构造函数的实例不同,后者需要一个EntityManager
.问题是,我如何制作TransactionInterceptor …
我不知道这是Gradle 1.0m7的错误,还是我们只是做错了.
我们有一些类被编译为项目的一部分,我们希望将它们单独地放入它自己的工件中.这些是例如我们想要与另一个项目共享的独立域模型对象.
我不想去多项目构建路线,那么我们如何告诉Gradle为这些创建另一个jar?
目前我们这样做:
task modelJar(type: Jar) {
classifier = 'model'
from fileTree(dir: sourceSets.main.classesDir).matching { include 'com/foo/bar/model/**' }
}
artifacts {
archives modeljar
}
Run Code Online (Sandbox Code Playgroud)
这里的问题是modeljar任务在编译类之前运行.起初我们没有意识到这一点,并认为这是有效的.事实证明,工件正在从上一次运行中获取类,而不是当前运行.在构建之前执行clean会导致jar中没有类,并显示问题.
我在看自定义配置,但它似乎相当复杂,我不想过度复杂的构建文件.
感谢任何建议.
谢谢.