2012-04-04 11 views
0

私のプロジェクトはEJBとJPA(Hibernateを使用)を使用していましたが、Springに切り替える必要がありました。 これまでにすべてがうまくいっていました。 EJBは、EntityManagerをインジェクトしたり、トランザクションを制御したりしました。SpringのEntityManagerが永続しない

私がSpringに切り替えたとき、私はSpringで新しくなっていたので、多くの問題がありました。しかし、すべてが実行された後、私は問題があります:データは決してデータベースに保存されません。私はトランザクションを制御するためにSpringを構成しました。JSFで使用されているSpring Beanを使用しています。このサービスにはEntityManagerがインジェクトされ、@ Transactional REQUIREDが使用されます。このサービスは、EntityManagerを、entityManager.persist(bean)を呼び出すDAOに渡します。

選択がうまくいくように見えますが、JTAトランザクションは(私が見たところで)うまくいくように見えますが、エンティティは保存されません!ここで

はログです:ログで

INFO: [Pronatec] - 04/04/2012 11:30:20 - [DEBUG] org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter: doFilterInternal() (linha 136): Opening JPA EntityManager in OpenEntityManagerInViewFilter 

INFO: [Pronatec] - 04/04/2012 11:30:20 - [DEBUG] org.springframework.beans.factory.support.DefaultListableBeanFactory: doGetBean() (linha 245): Returning cached instance of singleton bean 'transactionManager' 

INFO: [Pronatec] - 04/04/2012 11:30:20 - [DEBUG] org.springframework.orm.hibernate3.HibernateTransactionManager: getTransaction() (linha 365): Creating new transaction with name [br.org.cni.pronatec.controller.service.MontanteServiceImpl.adicionarValor]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT; '' 

INFO: [Pronatec] - 04/04/2012 11:30:20 - [DEBUG] org.springframework.orm.hibernate3.HibernateTransactionManager: doBegin() (linha 493): Opened new Session [[email protected]] for Hibernate transaction 

INFO: [Pronatec] - 04/04/2012 11:30:20 - [DEBUG] org.springframework.orm.hibernate3.HibernateTransactionManager: doBegin() (linha 504): Preparing JDBC Connection of Hibernate Session [[email protected]] 

INFO: [Pronatec] - 04/04/2012 11:30:20 - [DEBUG] org.springframework.orm.hibernate3.HibernateTransactionManager: doBegin() (linha 569): Exposing Hibernate transaction as JDBC transaction [[email protected]] 

INFO: [Pronatec] - 04/04/2012 11:30:20 - [DEBUG] org.springframework.orm.jpa.ExtendedEntityManagerCreator$ExtendedEntityManagerInvocationHandler: doJoinTransaction() (linha 383): Joined JTA transaction 


INFO: Hibernate: 
    select 
     hibernate_sequence.nextval 
    from 
     dual 

INFO: [Pronatec] - 04/04/2012 11:30:20 - [DEBUG] org.springframework.orm.hibernate3.HibernateTransactionManager: processCommit() (linha 752): Initiating transaction commit 

INFO: [Pronatec] - 04/04/2012 11:30:20 - [DEBUG] org.springframework.orm.hibernate3.HibernateTransactionManager: doCommit() (linha 652): Committing Hibernate transaction on Session [[email protected]] 

INFO: [Pronatec] - 04/04/2012 11:30:20 - [DEBUG] org.springframework.orm.hibernate3.HibernateTransactionManager: doCleanupAfterCompletion() (linha 734): Closing Hibernate Session [[email protected]] after transaction 

INFO: [Pronatec] - 04/04/2012 11:30:20 - [DEBUG] org.springframework.orm.hibernate3.SessionFactoryUtils: closeSession() (linha 800): Closing Hibernate Session 

INFO: [Pronatec] - 04/04/2012 11:30:20 - [DEBUG] org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter: doFilterInternal() (linha 154): Closing JPA EntityManager in OpenEntityManagerInViewFilter 

INFO: [Pronatec] - 04/04/2012 11:30:20 - [DEBUG] org.springframework.orm.jpa.EntityManagerFactoryUtils: closeEntityManager() (linha 343): Closing JPA EntityManager 

、私はそれがトランザクションをコミット見るが、私は(Hibernateが任意のクエリを印刷している)INSERTクエリが表示されません。また、シーケンスIDの次の値を取得するためのHibernateルックアップも参照してください。しかしその後、それは実際には挿入されません。ここで

は春のコンテキストコンフィギュレーションである:ここで

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
<property name="persistenceUnitName" value="PronatecPU" /> 
<property name="persistenceXmlLocation" value="classpath:META-INF/persistence.xml" /> 
<property name="loadTimeWeaver"> 
    <bean class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver"/> 
</property> 
<property name="jpaProperties"> 
    <props> 
    <prop key="hibernate.transaction.factory_class">org.hibernate.transaction.JTATransactionFactory</prop> 
    </props> 
</property> 
</bean> 


<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager" > 
    <property name="transactionManagerName" value="java:/TransactionManager" /> 
<property name="userTransactionName" value="UserTransaction" /> 
<property name="entityManagerFactory" ref="entityManagerFactory" /> 
</bean> 

<bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" /> 


<tx:annotation-driven transaction-manager="transactionManager" /> 

は私のpersistence.xmlである:ここでは

<?xml version="1.0" encoding="UTF-8"?> 
<persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"> 
    <persistence-unit name="PronatecPU" transaction-type="JTA"> 
    <provider>org.hibernate.ejb.HibernatePersistence</provider> 
    <jta-data-source>jdbc/pronatec</jta-data-source> 
    <class>br.org.cni.pronatec.model.bean.AgendamentoBuscaSistec</class> 
    <class>br.org.cni.pronatec.model.bean.AgendamentoExportacaoZeus</class> 
    <class>br.org.cni.pronatec.model.bean.AgendamentoImportacaoZeus</class> 
    <class>br.org.cni.pronatec.model.bean.Aluno</class> 
    <class>br.org.cni.pronatec.model.bean.Curso</class> 
    <class>br.org.cni.pronatec.model.bean.DepartamentoRegional</class> 
    <class>br.org.cni.pronatec.model.bean.Dof</class> 
    <class>br.org.cni.pronatec.model.bean.Escola</class> 
    <class>br.org.cni.pronatec.model.bean.Inconsistencia</class> 
    <class>br.org.cni.pronatec.model.bean.Matricula</class> 
    <class>br.org.cni.pronatec.model.bean.Montante</class> 
    <class>br.org.cni.pronatec.model.bean.ParametrosVingentes</class> 
    <class>br.org.cni.pronatec.model.bean.TipoCurso</class> 
    <class>br.org.cni.pronatec.model.bean.Turma</class> 
    <class>br.org.cni.pronatec.model.bean.UnidadeFederativa</class> 
    <class>br.org.cni.pronatec.model.bean.ValorAssistenciaEstudantil</class> 
    <class>br.org.cni.pronatec.model.bean.ValorHora</class> 
    <exclude-unlisted-classes>true</exclude-unlisted-classes> 
    <properties> 
     <property name="current_session_context_class" value="thread"/> 
     <property name="hibernate.show_sql" value="true"/> 
     <property name="hibernate.format_sql" value="true"/> 
     <property name="hibernate.dialect" value="org.hibernate.dialect.OracleDialect"/> 
     <property name="hibernate.transaction.manager_lookup_class" value="org.hibernate.transaction.SunONETransactionManagerLookup"/> 
     <property name="hibernate.hbm2ddl.auto" value="update"/> 
    </properties> 
    </persistence-unit> 
</persistence> 

は、管理対象Beanに注入され、私のサービスです。

@Service 
@Scope("prototype") 
@Transactional(propagation= Propagation.REQUIRED) 
public class MontanteServiceImpl { 
    // more code 
    @PersistenceContext(unitName="PronatecPU", type= PersistenceContextType.EXTENDED) 
    private EntityManager entityManager; 
    // more code 
    // The method that is called by another public method that do something before 
    private void salvarMontante(Montante montante) { 
     montante.setDataTransacao(new Date()); 

     MontanteDao montanteDao = new MontanteDao(entityManager); 
     montanteDao.salvar(montante); 
    } 
    // more code 
} 

私のMontanteDaoは、次のように基本DAOから継承します:

public class MontanteDao extends BaseDao<Montante> { 

    public MontanteDao(EntityManager entityManager) { 
     super(entityManager); 
    } 

} 

そしてBaseDaoに呼び出されるメソッドは以下です:

public void salvar(T bean) { 
    entityManager.persist(bean); 
} 

あなたが見ることができるように、それだけで注入されたEntityManagerを選んで、持続()メソッドを呼び出します。トランザクションはSpringで制御されていますが、ログに出力されているように表示されますが、挿入クエリは決してログに出力されず保存されません。

私の悪い英語については申し訳ありません。 お手数をおかけしていただきありがとうございます。

EDIT: デバッグすると、それぞれのentityManager.persist(T)の後に、「insert」というタイプのactionQueueにエンキューされた別のアクションがあります。結局のところ、それはアクションをキューに入れるだけであり、決してそれらを実行することはありません。すでにこのような問題に直面している人はいますか?

+0

transactionManagerの設定については確かですか?ログ(HibernateTransactionManager)のクラス名がspring xml(JPATransactionManager)にあるものと一致しません – gkamal

+0

これは正常かどうかわかりませんが、私はそうだと思います。ログの2行目は、TransactionManagerをインジェクトするSpringを示しています。 –

+0

TransactionManger BeanをJPATransactionManagerを使用するように変更するか、またはtransactionManager Beanをに置き換えます。 – gkamal

答えて

0

さて、私はついに私の問題を解決しました。 JTAのいくつかの設定ミスがありました。私は何ができるのか分からないが、私はRESOURCE_LOCALに変更して働いた。

初めてRESOURCE_LOCALを試してみましたが、Glassfishが@PersistenceContextアノテーションを検証し、「persistence-context-ref-name [...]に対応するパーシスタンスユニットを解決できませんでした。次に、この検証を無効にする良い方法を発見しました。

metadata-complete=true 

on web.xml 「必要でないので注釈を見ないでください」と書かれています。さて、Springは私のコンテナであり、それ自体で注釈を見て、必要なものを設定します。それで私はサーバーを必要としません。結局のところ

、私の構成は次のようになります。

のweb.xml:

<web-app version="3.0" 
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation=" 
     http://java.sun.com/xml/ns/javaee 
     http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" 
     metadata-complete="true"> 

Springののcontext.xml:

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
    <property name="persistenceUnitName" value="PronatecPU" /> 
    <property name="persistenceXmlLocation" value="classpath:META-INF/persistence.xml" /> 
    <property name="loadTimeWeaver"> 
     <bean class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver"/> 
    </property> 
    </bean> 

    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager" > 
    <property name="entityManagerFactory" ref="entityManagerFactory" /> 
    </bean> 

    <bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" /> 

    <tx:annotation-driven /> 

のpersistence.xml:

<persistence-unit name="PronatecPU" transaction-type="RESOURCE_LOCAL"> 
    <provider>org.hibernate.ejb.HibernatePersistence</provider> 
    <non-jta-data-source>jdbc/pronatec</non-jta-data-source> 
    <!-- ... --> 

そして私の注射されたentit yManager:

@PersistenceContext(type= PersistenceContextType.EXTENDED) 
private EntityManager entityManager; 

これは、誰が同じ問題を抱えているのを助けてくれることを願っています。

0

flushをデータベースに強制的に送信してください。

entityManager.flush(); 
+0

私はすでに試しました。それから、私は取引が利用できないという例外がありました。そして、私はEJB3を使用したときと同じように、JTAによって実行されるようにしました。とにかくありがとう。 –

関連する問題