我使用Spring数据jpa,我正在尝试向所有存储库添加自定义行为,如下所述: http://static.springsource.org/spring-data/data-jpa/docs/current/reference/html/#repositories.custom-behaviour-for-all-repositories
我遇到了几个问题:
- 首先,在 RepositoryMetadata 类中没有像 getDomainClass 那样的方法,如Spring文档中所述(见下文):
protected Object getTargetRepository(RepositoryMetadata metadata) {
return new MyRepositoryImpl<T, I>((Class<T>) metadata.getDomainClass(), entityManager);
}
我改为使用以下方法: getDomainType()这是对的吗?
- 我的应用程序在tomcat启动时抛出异常。这是完整的堆栈跟踪:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'globalRepositoryImpl' defined in file [E:\users\jumartin\dev_sts\.metadata\.plugins\org.eclipse.wst.server.core\
tmp0\wtpwebapps\SuiviTRC\WEB-INF\classes\trc\suivi\repository\GlobalRepositoryImpl.class]: Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Could
not instantiate bean class [trc.suivi.repository.GlobalRepositoryImpl]: No default constructor found; nested exception is java.lang.NoSuchMethodException: trc.suivi.repository.GlobalRepositoryImpl.<i
nit>()
这是我的自定义全局存储库代码:
public class GlobalRepositoryImpl<T, ID extends Serializable> extends SimpleJpaRepository<T, ID> implements GlobalRepository<T, ID> {
private EntityManager em;
public GlobalRepositoryImpl(Class<T> domainClass, EntityManager em) {
super(domainClass, em);
this.em = em;
}
public void sharedCustomMethod(ID id) {
}
}
这是我的xml配置:
<repositories base-package="trc.suivi.repository" factory-class="trc.suivi.repository.GlobalRepositoryFactoryBean">
<repository id="pliRepository" />
<repository id="globalRepository" />
</repositories>
我无法在网上找到任何其他样本。有人可以帮忙吗?
答案 0 :(得分:2)
我已经完成了如何向所有存储库添加自定义行为的完整示例。 http://borislam.blogspot.hk/2012/07/customizing-spring-data-jpa-repository.html
您可以将不同JPA实现的功能(例如hibernate,openJPA)添加到基本存储库。我已经做了另一个教程。 http://borislam.blogspot.hk/2012/07/adding-hibernate-native-sql-features.html
答案 1 :(得分:1)
我终于得到了一些帮助,并且能够通过在中间接口上使用@NoRepositoryBean注释来使我的存储库工作。
答案 2 :(得分:1)
从Spring Data JPA 1.9.M1开始,将自定义方法添加到Spring Data管理的所有存储库变得更加容易。 This示例包含所有详细信息。
在您的情况下,示例如下:
1)配置
@Configuration
@EnableAutoConfiguration
@EnableJpaRepositories(repositoryBaseClass = GlobalRepositoryImpl.class)
class CustomRepositoryConfig {}
2)自定义基础存储库:
public class GlobalRepositoryImpl<T, ID extends Serializable> extends SimpleJpaRepository<T, ID> implements GlobalRepository<ID> {
public GlobalRepositoryImpl(JpaEntityInformation<T, ?> entityInformation, EntityManager entityManager) {
super(entityInformation, entityManager);
}
@Override
public void sharedCustomMethod(ID id) {
}
}
3)一些存储库:
public interface SomeRepository extends GlobalRepository<User, Long> {}
当然GlobalRepository
仍然需要使用@NoRepositoryBean