我最近在一个春天的mvc项目上工作,我是一个新的冬眠和春天。
事实是,我想要保护自己不要一遍又一遍地复制代码,至少可以避免自己从crud操作中解脱出来。因此,如何制作通用接口然后实现的例子确实会有所帮助。我首先搜索了互联网,我发现了一些关于使用SessionFactory
的建议(我已经感谢春天了),以及使用交易管理器的建议(不要真的得到如何使用,即使,我想添加一些@Transactional
注释)
而且,一个非常重要的问题,我想知道我应该处理哪些例外?
答案 0 :(得分:6)
通常,您可以创建一个通用的DAO接口(可以称为CRUD存储库)并使其成为通用的。示例(请注意,这不是冗长的,仅供参考):
public interface GenericDAO<T, ID extends Serializable> {
T save(T entity);
void delete(T entity);
}
示例实施:
public class GenericHibernateDAO<T, ID extends Serializable>
implements GenericDAO<T, ID> {
private Class<T> persistentClass;
public GenericHibernateDAO() {
this.persistentClass = (Class<T>) ((ParameterizedType) getClass()
.getGenericSuperclass()).getActualTypeArguments()[0];
}
private SessionFactory sessionFactory;
public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
public Session getSession()
{
return sessionFactory.getCurrentSession();
}
@Override
public T save(T entity)
{
getSession().save(entity);
return entity;
}
@Override
public void delete(T entity) {
getSession().delete(entity);
}
}
另外,您可以参考其他similar SO问题。
对于异常处理,您可以使用@ControllerAdvice
处理业务异常,也可以处理单个控制器级别或单个点的任何异常。
E.g:
@ControllerAdvice
public class GlobalDefaultExceptionHandler {
@ExceptionHandler(Exception.class)
public String exception(Exception e) {
return "error";
}
}
Here是一个很好的博客,它使用@ExceptionHandler
触及单个控制器级别的异常处理,使用@ControllerAdvice
以及@ExceptionHandler
---------------------------------- UPDATE ------------ ------------------------
Hibernate抛出一个名为HibernateException
的运行时异常。
将@Transactional
视为数据库中的BEGIN TRANSACTION COMMIT ROLLBACK
模型,即如果您在事务中执行任何操作,并且在此期间发生任何错误,则应回滚整个事务。因此,通常我们将这种代码/注释(@Transactional
)放在服务层中,您可以将几个dao方法组合在一起,并将它们放在一个事务中,使它们成为一个工作单元。
使用它的语法是:
@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
这意味着如果发生任何异常(请注意我已明确提到Exception.class
您可以增加范围并使其Throwable.class
)spring将回滚任何已更新/插入/删除的数据您。如果您想了解Propagation
,请参阅this。