我在Java中使用了数据访问对象( Data Access Object,DAO)模式,并且在我的文件中重复了相同的代码。事情是这样的:
public User getById(int id) throws BDException {
Session session = sessionFactory.getCurrentSession();
Transaction tx = session.getTransaction();
try {
tx.begin();
Query query = session.createQuery("SELECT u FROM User u WHERE u.id=:id");
query.setString("id", id);
User user = (User) query.uniqueResult();
tx.commit();
return user;
}
catch(javax.validation.ConstraintViolationException | org.hibernate.exception.ConstraintViolationException cve) {
try {
if(tx.getStatus() == TransactionStatus.ACTIVE) {
tx.rollback();
}
}
catch(Exception exc) {
LOGGER.error("Error rollback in method='" + getMethodName() + "'");
}
throw new BDException(cve);
}
catch(RuntimeException ex) {
try {
if(tx.getStatus() == TransactionStatus.ACTIVE) {
tx.rollback();
}
}
catch(Exception exc) {
LOGGER.error("Error rollback in method='" + getMethodName() + "'");
}
throw ex;
}
catch(Exception ex) {
try {
if(tx.getStatus() == TransactionStatus.ACTIVE) {
tx.rollback();
}
}
catch(Exception exc) {
LOGGER.error("Error rollback in method='" + getMethodName() + "'");
}
throw new RuntimeException(ex);
}
}
好吧,我想让你看看捕获物的部分。我在所有的方法中都重复了这一点。如果是简单代码,我可以创建一个方法,将所有代码放在其中并调用该方法,而不是重复代码。问题是,这不是正常的代码,它们是异常。
那么,有没有什么解决方案可以重用代码而不在每个方法中重复(复制-粘贴)代码?
谢谢!
发布于 2018-12-19 06:12:21
看起来像是Execute Around idiom的工作。
将专门化代码放在lambda表达式中。将专门化的代码传递给一个具有通用代码的方法,该方法在适当的位置执行包含lambda表达式的对象。
对于您的代码,具体取决于您想要提取的内容,用法可能如下所示:
public User getById(int id) throws BDException {
return query(
"SELECT u FROM User u WHERE u.id=:id",
query -> {
query.setString("id", id);
return (User) query.uniqueResult();
}
);
}
https://stackoverflow.com/questions/53841603
复制相似问题