Java 使用EntityManager时如何处理Hibernate会话?
Out团队目前正在编写一个JavaEE Web应用程序,用于Tomcat appserver 我们希望使用Hibernate 5.0.1处理持久性。为了访问数据库实体,我们使用的EntityManager不是来自JPA的,它们是由我们实现的,请参见下文,它提供了在关联表中列出、创建和删除行的方法。模型类使用Hibernate注释进行映射 我们还有一个静态类PersistenceController,它初始化Hibernate的SessionFactory,并提供一个静态方法来获取新打开的会话 当然,我们希望能够使用单元测试来测试类的功能,所以PersistenceController是我们眼中的一个小刺 其他人建议我将所有内容从PersistenceController移动到EntityManager基类。但他不确定这是否会有任何副作用 所以我想让我们问问蜂群的大脑。在这种情况下,最佳做法是什么 如果需要更多的代码,我很乐意提供 持久控制器 实体管理器 产品经理 您的EntityManagerbetter调用BaseDao或GenericDao的想法很好,但需要一些改进 首先,基本CRUD方法不必是抽象的。它们可以简单地在泛型类型T上持久化/加载/删除/列出。这样,您就不必在每个子类上编写这些方法。请参阅此通用dao方法 第二,您正在手动管理事务,是否有充分的理由这样做? 对于容器管理的事务,您不需要使用注释,它们通过消除样板文件try{…}catch{//rollback},大大简化了代码Java 使用EntityManager时如何处理Hibernate会话?,java,hibernate,jakarta-ee,Java,Hibernate,Jakarta Ee,Out团队目前正在编写一个JavaEE Web应用程序,用于Tomcat appserver 我们希望使用Hibernate 5.0.1处理持久性。为了访问数据库实体,我们使用的EntityManager不是来自JPA的,它们是由我们实现的,请参见下文,它提供了在关联表中列出、创建和删除行的方法。模型类使用Hibernate注释进行映射 我们还有一个静态类PersistenceController,它初始化Hibernate的SessionFactory,并提供一个静态方法来获取新打开的会话 当
基本上,对于GenericDao和容器管理的事务,您根本不需要这些代码,您的类使用具体类型对GenericDao进行子类分类,并且它们可以在数据库上执行CRUD,而无需一行代码。您的EntityManager是否与JPA有某种关联?这样命名clash对于以后的讨论来说是不好的,而且您所写的看起来像DAO模式。我不知道。EntityManager是一个抽象类,它强制子类实现函数T list、void createT entity和deleteT entity,其中T必须是抽象类PersistenceEntity的子类型。它与您链接到的类没有任何关系。那么,我强烈建议更改它-在相关上下文中使用JPA see定义的最重要的类的名称用于您自己的目的是一个非常糟糕的主意,只是等待迷惑每一个需要查看该代码的程序员。注意,他确实提到了Tomcat的使用,而不是JavaEE容器。你是对的,刚刚看到,Tomcat只是一个servlet容器。但是这个建议仍然有效,我建议他在这种情况下使用Spring提供的声明性事务。目前查看Spring时,我知道它存在,但从未积极使用过。我还查看了您链接到的GenericDao,有趣的是,它使用的代码与我们在PersistenceController中使用的代码基本相同。该项目也获得了麻省理工学院的许可,遗憾的是没有提供pom.xml。我还不太熟悉许可证。如果我做对了,我可以把源文件复制到我们的项目中,并把版权声明放在上面,对吗?是的。无论如何,我建议您看看spring数据项目,它提供了这些现成的东西。
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.boot.MetadataSources;
import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
public class PersistenceController {
private static final SessionFactory sessionFactory;
static {
final StandardServiceRegistry registry = new StandardServiceRegistryBuilder()
.configure() // configures settings from hibernate.cfg.xml
.build();
try {
sessionFactory = new MetadataSources(registry).buildMetadata()
.buildSessionFactory();
} catch (Exception e) {
// The registry would be destroyed by the SessionFactory, but we had
// trouble building the SessionFactory
// so destroy it manually.
StandardServiceRegistryBuilder.destroy(registry);
throw e;
}
}
public static Session openSession() {
return sessionFactory.openSession();
}
}
import java.util.List;
public abstract class EntityManager<T extends PersistenceEntity> {
public abstract List<T> listAll();
public abstract void save(T entity);
public abstract void delete(T entity);
}
import java.util.ArrayList;
import java.util.List;
import org.hibernate.Session;
import org.hibernate.Transaction;
import etepat.model.product.Product;
public class ProductManager extends EntityManager<Product> {
public ProductManager() {
super();
}
@Override
public List<Product> listAll() {
try (Session session = PersistenceController.openSession()) {
Transaction transaction = null;
try {
transaction = session.beginTransaction();
@SuppressWarnings("unchecked")
List<Product> returned = session.createCriteria(Product.class)
.list();
transaction.commit();
return returned;
} catch (Exception e) {
if (transaction != null) {
transaction.rollback();
}
e.printStackTrace();
}
}
return new ArrayList<Product>();
}
@Override
public void save(Product entity) {
// TODO Auto-generated method stub
}
@Override
public void delete(Product entity) {
// TODO Auto-generated method stub
}
}