Fab*_* B. 36 java generics spring dao hibernate
我的web应用程序已经得到了很多服务表/实体,如payment_methods
,tax_codes
,province_codes
,等.
每次我添加一个新实体,我都要写一个DAO.问题是,基本上,它们都是一样的,但唯一的区别是实体类本身.
我知道Hibernate工具可以自动为我生成代码,但我现在不能使用它们(不要问为什么)所以我在考虑使用Generic DAO.有很多关于这方面的文献,但我不能把它们放在一起,让它与Spring一起工作.
我认为这是关于泛型的,它将有四种基本方法:
listAll
saveOrUpdate
deleteById
getById
就这样.
不重新发明车轮的最佳做法是什么?是不是有东西可以使用了呢?
Nim*_*sky 42
这是我的
@Component
public class Dao{
@Resource(name = "sessionFactory")
private SessionFactory sessionFactory;
public <T> T save(final T o){
return (T) sessionFactory.getCurrentSession().save(o);
}
public void delete(final Object object){
sessionFactory.getCurrentSession().delete(object);
}
/***/
public <T> T get(final Class<T> type, final Long id){
return (T) sessionFactory.getCurrentSession().get(type, id);
}
/***/
public <T> T merge(final T o) {
return (T) sessionFactory.getCurrentSession().merge(o);
}
/***/
public <T> void saveOrUpdate(final T o){
sessionFactory.getCurrentSession().saveOrUpdate(o);
}
public <T> List<T> getAll(final Class<T> type) {
final Session session = sessionFactory.getCurrentSession();
final Criteria crit = session.createCriteria(type);
return crit.list();
}
// and so on, you shoudl get the idea
Run Code Online (Sandbox Code Playgroud)
然后您可以在服务层中进行访问:
@Autowired
private Dao dao;
@Transactional(readOnly = true)
public List<MyEntity> getAll() {
return dao.getAll(MyEntity.class);
}
Run Code Online (Sandbox Code Playgroud)
Tom*_*icz 25
Spring Data JPA是一个很棒的项目,可以为您生成DAO等等!您只需要创建一个接口(没有任何实现):
interface PaymentMethodsDao extends JpaRepository<PaymentMethods, Integer> {}
Run Code Online (Sandbox Code Playgroud)
此接口(通过继承JpaRepository
)将自动为您提供:
PaymentMethod save(PaymentMethod entity);
Iterable<PaymentMethod> save(Iterable<? extends PaymentMethod> entities);
PaymentMethod findOne(Integer id);
boolean exists(Integer id);
Iterable<PaymentMethod> findAll();
long count();
void delete(Integer id);
void delete(PaymentMethod entity);
void delete(Iterable<? extends PaymentMethod> entities);
void deleteAll();
Iterable<PaymentMethod> findAll(Sort sort);
Page<PaymentMethod> findAll(Pageable pageable);
List<PaymentMethod> findAll();
List<PaymentMethod> findAll(Sort sort);
List<PaymentMethod> save(Iterable<? extends PaymentMethods> entities);
void flush();
PaymentMethod saveAndFlush(PaymentMethods entity);
void deleteInBatch(Iterable<PaymentMethods> entities);
Run Code Online (Sandbox Code Playgroud)
界面是强类型(泛型)并自动为您实现.对于每个实体,您所要做的就是创建一个扩展接口JpaRepository<T,Integer extends Serializable>
.
但等等,还有更多!假设你PaymentMethod
有name
和validSince
持久字段.如果您将以下方法添加到您的界面:
interface PaymentMethodsDao extends JpaRepository<PaymentMethods, Integer> {
Page<PaymentMethod> findByNameLikeAndValidSinceGreaterThan(
String name, Date validSince, Pageable page
);
}
Run Code Online (Sandbox Code Playgroud)
框架将解析方法名称:
findBy
(名称之类)And
(ValidSince大于)
创建JPA QL查询,应用分页和排序(Pageable page
)并为您运行它.无需实施:
paymentMethodsDao.findByNameLikeAndValidSinceGreaterThan(
"abc%",
new Date(),
new PageRequest(0, 20, Sort.Direction.DESC, "name"
);
Run Code Online (Sandbox Code Playgroud)
结果查询:
SELECT * //or COUNT, framework also returns the total number of records
FROM PaymentMethods
WHERE name LIKE "abc%"
AND validSince > ...
Run Code Online (Sandbox Code Playgroud)
并应用分页.
唯一的缺点是该项目相当新,而且相对容易受到影响(但它非常积极地开发).