首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Hibernate 4在抽象工厂中创建会话工厂

Hibernate 4在抽象工厂中创建会话工厂
EN

Stack Overflow用户
提问于 2016-03-29 12:42:28
回答 1查看 643关注 0票数 1

我在一个带有Hibernate 4.2的web应用程序中工作,我已经实现了抽象工厂模式,但是对于创建会话工厂,我没有init方法,因为我使用第一个调用来创建会话工厂,以便像静态一样向前重用,就像您可以看到我从DAOImpl获得了会话,并最终关闭了它。首先,我想问一下,这种做法是否正确?还有更好的练习吗?

代码语言:javascript
复制
public class HibernateSessionFactory {

    private static SessionFactory sessionFactory = buildSessionFactory();

    private static final Logger logger = LogManager.getLogger(HibernateSessionFactory.class);

    private static SessionFactory buildSessionFactory() {
        try {

            Configuration configuration = new Configuration();
            configuration.configure("hibernate.cfg.xml");

            ServiceRegistry sr = new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry();
            SessionFactory sf = configuration.buildSessionFactory(sr);

            return sf;

        } catch (Exception ex) {
            logger.error("Initial SessionFactory creation failed.", ex);
            ex.printStackTrace();
            throw  ex;

        }
    }

    public static SessionFactory getSessionFactory() {
        return sessionFactory;
    }

    public static void shutdownSessionFactory() {
        sessionFactory.close();
    }

}

DAOIMPL

代码语言:javascript
复制
public class RecordDAOImpl implements RecordDAO{.....

public String getRecord (Long id){
        Session session = HibernateSessionFactory.getSessionFactory().openSession();


        try {
            session.beginTransaction();     
            .
            .
            .

            session.getTransaction().commit();

        } catch (Exception e) {
            session.getTransaction().rollback();
        } finally {
            session.close();
        }

        return value;
    }

DAO

代码语言:javascript
复制
    public interface FieldDAO {.....

String getRecord (Long id);

工厂

代码语言:javascript
复制
public class HibernateFactoryDao extends DAOFactory {...

@Override
    public RecordDAOImpl getRecordDAO() {
        return new RecordDAOImpl();
    }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-31 09:11:30

作为另一种选择,您可以使用CDI将工厂注入RecordDAOImpl,并根据ORM类型检索会话。

作为一个可能的例子,您可以尝试以下方法:

1.在您的ORM工厂之间创建一个指针限定符

代码语言:javascript
复制
@Qualifier
@Retention(RUNTIME)
@Target({ TYPE, METHOD, FIELD, PARAMETER })
public @interface ORMSessionFactory {

    ORMType value();

    public enum ORMType {
        HIBERNATE,
        ECLIPSELINK;
    }
}

2.为会话工厂定义接口。

代码语言:javascript
复制
public interface MySessionFactory {

    public SessionFactory getSessionFactory();

    public void shutdownSessionFactory();
}

如果有必要,3.创建一个包含所有ORM工厂实现的公共行为的抽象类。

代码语言:javascript
复制
public abstract class AbstractSessionFactory implements MySessionFactory {

    protected SessionFactory sessionFactory;

    public AbstractSessionFactory() {
        buildSessionFactory();
    }

    @Override
    public SessionFactory getSessionFactory() {
        return sessionFactory;
    }

    @Override
    public void shutdownSessionFactory() {
        if (sessionFactory != null) {
            sessionFactory.close();
        }
    }

    protected abstract SessionFactory buildSessionFactory();
}

4.用相应的类型注释ORM工厂实现

代码语言:javascript
复制
@ORMSessionFactory(ORMType.HIBERNATE)
public class HibernateSessionFactory extends AbstractSessionFactory {

    @Override
    protected SessionFactory buildSessionFactory() {
        try {

            Configuration configuration = new Configuration();
            configuration.configure("hibernate.cfg.xml");

            ServiceRegistry sr = new StandardServiceRegistryBuilder()
                .applySettings(configuration.getProperties()).build();
            sessionFactory = configuration.buildSessionFactory(sr);

            return sessionFactory;

        } catch (Exception ex) {
            throw ex;
        }
    }
}

然后,在5.上,您可以在RecordDAOImpl上执行以下操作

代码语言:javascript
复制
public class RecordDAOImpl implements RecordDAO {

    @Inject
    @ORMSessionFactory(ORMType.HIBERNATE)
    private MySessionFactory mySessionFactory;

    @Override
    public String getRecord(Long id) {
        String value = null;
        Session session = mySessionFactory.getSessionFactory().openSession();

        try {
            session.beginTransaction();

            // do some transactional stuff

            session.getTransaction().commit();

        } catch (Exception e) {
            session.getTransaction().rollback();
        } finally {
            session.close();
        }

        return value;
    }
}

不要忘记,为了启用CDI,您应该在META (JAR)或WEB文件夹(WAR)中包含一个beans.xml:

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee 
                           http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd"
version="1.1" bean-discovery-mode="all">
</beans>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36284614

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档