0

我对休眠的使用如下所示:

这就是我配置 sessionFactory 的方式

    Configuration configuration = new Configuration()
                                            .addResource(MAPPING_RESSOURCE)// -> hibernate.hbm.xml
                                            .configure(CONFIG_RESSOURCE)// -> hibernate.cfg.xml;

    ServiceRegistry serviceRegistry = new ServiceRegistryBuilder()
                                            .applySettings(configuration.getProperties())
                                            .buildServiceRegistry();

    factory = configuration.buildSessionFactory(serviceRegistry);

SessionFactory 配置为使用 ThreadLocalSessionContext(来自 hibernate.cfg.xml 的行):

<property name="current_session_context_class">org.hibernate.context.internal.ThreadLocalSessionContext</property>

我从这个 dao 基础方法获取当前会话:

protected Session getSession(){return factory.getCurrentSession();}

我在抽象 dao 基类中获得了一些用于 CRUD 操作的方法,例如“get”:

public T get(int key) throws HibernateException
{       
    Transaction transaction = null;

    try
    {
        Session session = getSession();

        transaction = session.beginTransaction();

        T t = (T)session.get(classOfT, key);

        transaction.commit();

        return t;
    }
    catch(HibernateException e)
    {
        if(transaction != null)
            transaction.rollback();

        throw e;
    }       
}

现在问题来了。我想使用 guice 的 transactional 属性来缩短代码,如下所示:

@Transactional
public T get(int key) throws HibernateException
{       
    T t = (T)session.get(classOfT, key);                
}

但是,我看到的所有教程都表明 guice 持久性支持是为 JPA 量身定制的,即 EntityManager、persistence.xml 等。是否有可能保留我上面显示的设置并使用@Transactional?

谢谢

4

1 回答 1

1

我建议使用Warp-persist。即使在 guice-persist 出现后,我也一直在使用它。经过多年的使用,到目前为止有 0 个问题。主要使用每事务会话策略。

http://www.wideplay.com/webextensions%3A%3Ajpaintegration2

唯一的问题是您必须从源代码构建它并将其部署到公司关系。这是无痛的,但需要一些时间来完成。

http://code.google.com/p/warp-persist/source/checkout

或者,如果您想使用 Guice-persist,那么只需提供像这样的 persistence.xml

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
    version="2.0">
    <persistence-unit name="myapp" transaction-type="RESOURCE_LOCAL">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <properties>
            <property name="hibernate.ejb.cfgfile" value="hibernate.cfg.xml"></property> 
        </properties>
    </persistence-unit>
</persistence>

并为 Native Hibernate API 创建自己的提供程序(它们被注入 JPA API,您只需返回底层实现 - Hibernate)。例如在一个模块中做

@Provides Session emToSession(EntityManager em){ 
    return entityManager.unwrap(Session.class);
}
于 2013-05-27T20:53:31.957 回答