Java 使用EntityManager时如何处理Hibernate会话?

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,并提供一个静态方法来获取新打开的会话 当

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},大大简化了代码


基本上,对于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

    }

}