我有三个JPA实体类A,B并C具有以下层次结构:
A
|
+---+---+
| |
C B
Run Code Online (Sandbox Code Playgroud)
那是:
@Entity
@Inheritance
public abstract class A { /* ... */ }
@Entity
public class B extends A { /* ... */ }
@Entity
public class C extends A { /* ... */ }
Run Code Online (Sandbox Code Playgroud)
使用Spring Data JPA,为这些实体编写存储库类的最佳方法是什么?
我知道我可以写这些:
public interface ARespository extends CrudRepository<A, Long> { }
public interface BRespository extends CrudRepository<B, Long> { }
public interface CRespository extends CrudRepository<C, Long> …Run Code Online (Sandbox Code Playgroud) 如果有人需要在Spring Data存储库上使用@Primary:看起来Spring Data JPA忽略@Primary了存储库上的注释.
作为一种解决方法,我创建了BeanFactoryPostProcessor哪个检查给定的存储库是否有@Primary注释并将该bean设置为主要.
这是代码:
@Component
public class SpringDataPrimaryPostProcessor implements BeanFactoryPostProcessor {
public static final String REPOSITORY_INTERFACE_PROPERTY = "repositoryInterface";
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
makeRepositoriesPrimary(getRepositoryBeans(beanFactory));
}
protected List<BeanDefinition> getRepositoryBeans(ConfigurableListableBeanFactory beanFactory) {
List<BeanDefinition> springDataRepositoryDefinitions = Lists.newArrayList();
for (String beanName : beanFactory.getBeanDefinitionNames()) {
BeanDefinition beanDefinition = beanFactory.getBeanDefinition(beanName);
String beanClassName = beanDefinition.getBeanClassName();
try {
Class<?> beanClass = Class.forName(beanClassName);
if (isSpringDataJpaRepository(beanClass)) {
springDataRepositoryDefinitions.add(beanDefinition);
}
} catch (ClassNotFoundException e) {
throw new ApplicationContextException(String.format("Error when trying …Run Code Online (Sandbox Code Playgroud)