[英]Hibernate JPA simplify code for update(),delete(),add()
我创建了使用JPA的update()方法。 看起来像这样:
public boolean update(Programy program) throws Exception {
try {
entityManagerFactory = Persistence.createEntityManagerFactory("firebird_config_file");
entityManager = entityManagerFactory.createEntityManager();
entityManager.getTransaction().begin();
entityManager.merge(program);
entityManager.getTransaction().commit();
entityManager.close();
entityManagerFactory.close();
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
在我的save()和delete方法中,我仅更改了一件事-merge()-> persist()或delete()。 其余代码与此处相似。 我如何重构此代码以简化此过程?
这是称为模板方法的模式的很好用例。
例如,您可以创建一个抽象类,该类将您的所有样板代码包装在perform
方法中:
abstract public class HibernateAction<T> {
private EntityManagerFactory entityManagerFactory;
//I'm passing EntityManagerFactory, because it should be singleton and you shouldn't
//probably create it from scratch everytime
public HibernateAction(EntityManagerFactory entityManagerFactory) {
this.entityManagerFactory = entityManagerFactory;
}
protected abstract T action(EntityManager entityManager, T entity);
public boolean perform(T entity) throws Exception {
try {
var entityManager = entityManagerFactory.createEntityManager();
entityManager.getTransaction().begin();
action(entityManager, entity); //call to action which need to be overriden
entityManager.getTransaction().commit();
entityManager.close();
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
}
那么您可以创建一个继承HibernateAction
的类:
public class UpdateAction extends HibernateAction<Program> {
public UpdateAction(EntityManagerFactory entityManagerFactory) {
super(entityManagerFactory);
}
@Override
protected Program action(EntityManager entityManager, Program entity) {
return entityManager.merge(entity);
}
}
最后,您可以像这样使用它:
public boolean update(Program program) throws Exception {
return updateAction.perform(program);
}
但是,由于Java(自Java 8起)支持匿名方法,因此您也可以使用高阶函数以较少的冗长方式重写它:
public class HibernateAction2{ // no longer abstract
private EntityManagerFactory entityManagerFactory;
public HibernateAction2(EntityManagerFactory entityManagerFactory) {
this.entityManagerFactory = entityManagerFactory;
}
//we expect a user to pass lambda function, which would tell us what to do with an entity manager
public boolean perform (Consumer<EntityManager> action) throws Exception {
try {
var entityManager = entityManagerFactory.createEntityManager();
entityManager.getTransaction().begin();
action.accept(entityManager);
entityManager.getTransaction().commit();
entityManager.close();
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
}
然后您可以像这样使用它:
hibernateAction2.perform(em -> em.merge(program)); //for merge
hibernateAction2.perform(em -> em.persist(program)); //for persist, etc.
这就是所谓的贷款模式或租用模式 (或支架在FP语言),因为从hibernateAction2你“贷款”实体管理器使用它做某种动作,但它处理所有其他的事情,比如创建一个对象或关闭连接。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.