Spring Data Jpa custom functionality for all reposotories
I tried to implement custom functionality for all of my repositories (I
used Packt Spring Data sample as base). I would like to override some of
the default beahaviours.
First I implemented:
@NoRepositoryBean
public interface BaseRepository<T extends AbstractModel, ID extends
Serializable> extends JpaRepository<T, ID>, QueryDslPredicateExecutor<T> {
@Override
public void delete(final T t);
public T save(final T entity);
}
AbstractModel is for logic delete:
public interface AbstractModel {
public boolean isDeleted();
public void setDeleted(boolean deleted);
}
GenericBaseRepository implements custom fuctions. I need logical delete
function. And I would like to override save to use always merge to handle
saving of cascade objects.
public class GenericBaseRepository<T extends AbstractModel, ID extends
Serializable> extends QueryDslJpaRepository<T, ID> implements
BaseRepository<T, ID> {
protected final Logger logger = LoggerFactory.getLogger(getClass());
@PersistenceContext
private EntityManager entityManager;
Class<T> type;
public GenericBaseRepository(final JpaEntityInformation<T, ID>
entityMetadata, final EntityManager entityManager) {
super(entityMetadata, entityManager);
}
@Override
public void delete(final T t) {
t.setDeleted(true);
save(t);
}
@Override
public void delete(final ID id) {
final T deleted = findOne(id);
if (deleted == null) {
logger.warn("{} Record not found: id={}", getClass(), id);
}
deleted.setDeleted(true);
save(deleted);
}
@Override
@Transactional
public <S extends T> S save(final S entity) {
return entityManager.merge(entity);
}
}
BaseRepositoryFactoryBean initializes GenericBaseRepository
public class BaseRepositoryFactoryBean<R extends JpaRepository<T, I>, T, I
extends Serializable> extends JpaRepositoryFactoryBean<R, T, I> {
@Override
protected RepositoryFactorySupport createRepositoryFactory(final
EntityManager entityManager) {
return new BaseRepositoryFactory(entityManager);
}
protected static class BaseRepositoryFactory<T extends AbstractModel,
I extends Serializable> extends JpaRepositoryFactory {
private final EntityManager entityManager;
public BaseRepositoryFactory(final EntityManager entityManager) {
super(entityManager);
this.entityManager = entityManager;
}
@Override
protected Object getTargetRepository(final RepositoryMetadata
metadata) {
return new GenericBaseRepository<T,
I>((JpaEntityInformation<T, I>)
getEntityInformation(metadata.getDomainType()),
entityManager);
}
@Override
protected Class<?> getRepositoryBaseClass(final RepositoryMetadata
metadata) {
return GenericBaseRepository.class;
}
}
}
Here is the relevant part of spring config xml:
<jpa:repositories base-package="sample.project.repository" />
Custom classes and interfaces are in this package and there are concrete
repository interfaces too.
I also have configuration annotation on my @Configuration class
@Configuration
@EnableTransactionManagement
@ComponentScan({"sample.project.repository", "sample.project.service"})
@ImportResource({"classpath:applicationContext.xml"})
@EnableJpaRepositories(basePackages = {"sample.project.repository"},
repositoryFactoryBeanClass = BaseRepositoryFactoryBean.class)
public class ApplicationContextConfig {
Standard Spring Data functinality works fine, but custom overrides are
not. Save and delete functions are not overridden. When calling them
original parent methods are executed.
No comments:
Post a Comment