2013-05-27 4 views
0

моего использование спящего режима выглядит следующим образом:с помощью Guice trancactional атрибута для спящего режима без JPA

это, как я настроить 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> 

я получить текущий сеанс из этого базового метода дао:

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

и я получил некоторые методы CRUD операций в абстрактном дао BaseClass, как этот для «получить»:

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 
public T get(int key) throws HibernateException 
{  
    T t = (T)session.get(classOfT, key);     
} 

однако, все учебники, которые я видел, показывают, что поддержка Guice инерционность специально для JPA, что EntityManager, persistence.xml и так вперед. Есть ли возможность сохранить приведенную выше настройку и использовать @Transactional?

благодаря

ответ

1

Я предлагаю использовать Warp-persist. Я использую его даже после того, как вышел guice-persist. До сих пор было выпущено 0 выпусков после многих лет использования. Используется в основном стратегия сеанса за транзакцию.

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

Единственная загвоздка вы должны построить его из источников и развернуть его в компании Nexus. Это безболезненно, но требуется несколько минут.

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

В качестве альтернативы, если вы хотите использовать Guice-упорствовать, то просто поставить 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); 
} 
+0

этот ответ звучит глубоко, спасибо. Кажется, что warp-persist является тем, что я искал. однако несколько странно, что они не предоставляют репозиторий maven и что последнее совершение было несколько лет назад. но, по крайней мере, есть банка: https://code.google.com/p/warp-persist/source/browse/trunk/warp-persist/#warp-persist%2Fdist –

+0

Добро пожаловать. Я рекомендую не использовать опубликованную банку. По сравнению с последним фиксатором, опубликованные банки устарели! Есть исправления и улучшения за пределами последней опубликованной банки. Imho, это хорошая идея, чтобы построить его самостоятельно и посмотреть на некоторые из кода. Вам нужно сделать только _ant clean dist_ после проверки svn. –

Смежные вопросы