2016-07-05 4 views
1

Je travaille avec Spring MVC 3.2.6, Hibernate 4, Oracle et Weblogic 10.3.6SessionFactory Hibernate ne commit pas la base de données Oracle

Je veux engager dans la base de données Oracle en utilisant une entité Hibernate et JPA. Dans la console du serveur, je ne vois pas d'erreurs. Mais lorsque je vérifie la table Oracle, les nouveaux enregistrements ne sont pas enregistrés.

Ceci est mon entité JPA

package eusurvey.modelA.daos; 

import java.io.Serializable; 
import javax.persistence.*; 


/** 
* The persistent class for the PREFERENCIAS database table. 
* 
*/ 
@Entity 
@Table(name="PREFERENCIAS") 
public class Preferencia implements Serializable { 
    private static final long serialVersionUID = 1L; 

    @Id 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    @Column(name="PREFERENCIAS_ID") 
    private long preferenciasId; 

    private String nombre; 

    private String valor; 

    public Preferencia() { 
    } 

    public long getPreferenciasId() { 
     return this.preferenciasId; 
    } 

    public void setPreferenciasId(long preferenciasId) { 
     this.preferenciasId = preferenciasId; 
    } 

    public String getNombre() { 
     return this.nombre; 
    } 

    public void setNombre(String nombre) { 
     this.nombre = nombre; 
    } 

    public String getValor() { 
     return this.valor; 
    } 

    public void setValor(String valor) { 
     this.valor = valor; 
    } 

} 

classe de service AdministrationService.java.I utilisent la méthode createPreferencia.

package eusurvey.services; 

import java.util.ArrayList; 
import java.util.List; 

import javax.annotation.Resource; 



import org.hibernate.Query; 
import org.hibernate.SQLQuery; 
import org.hibernate.Session; 
import org.hibernate.SessionFactory; 
import org.hibernate.cfg.Configuration; 
import org.springframework.stereotype.Service; 
import org.springframework.transaction.annotation.Transactional; 
import org.apache.log4j.Logger; 

import eusurvey.modelA.daos.EncuestaSem; 
import eusurvey.modelA.daos.Encuestado; 
import eusurvey.modelA.daos.Preferencia; 
import eusurvey.tools.ConversionTools; 


@Service("administrationService") 
public class AdministrationService { 
    private static final Logger logger = Logger.getLogger(AdministrationService.class); 

    @Resource(name="sessionFactory") 
    private SessionFactory sessionFactory; 



    @Transactional 
    public void createEncuestado(Encuestado encuestado) throws Exception { 
     Session session = sessionFactory.getCurrentSession(); 



     session.save(encuestado); 
    } 

    @Transactional(readOnly = false) 
    public void createEncuesta(EncuestaSem encuesta) throws Exception { 
     Session session = sessionFactory.getCurrentSession(); 


     logger.info("fecha inicio "+encuesta.getFechaInicio()); 
     session.save(encuesta); 
     logger.info("Grabada encuesta"); 
    } 

    @Transactional(readOnly = false) 
    public void createPreferencia(Preferencia preferencia) throws Exception { 
     Session session = sessionFactory.getCurrentSession(); 



     session.save(preferencia); 
     logger.info("Grabada prefencia"); 
    } 

} 

Java où j'appelle la méthode createPreferencia est

administrationService.createPreferencia(preferencia); 

messages serveur Console sont

04:46 DEBUG SQL:104 - select hibernate_sequence.nextval from dual 
Hibernate: select hibernate_sequence.nextval from dual 
2016-07-05 14:04:46 DEBUG SequenceGenerator:128 - Sequence identifier generated: BasicHolder[java.lang.Long[1404]] 
2016-07-05 14:04:46 DEBUG AbstractSaveEventListener:131 - Generated identifier: 1404, using strategy: org.hibernate.id.SequenceGenerator 
2016-07-05 14:04:46 INFO AdministrationService:60 - Grabada prefencia 
2016-07-05 14:04:46 INFO ConsultasArielService:213 - despues de commit preferencia 
2016-07-05 14:04:46 DEBUG AbstractTransactionImpl:173 - committing 
2016-07-05 14:04:46 DEBUG JdbcTransaction:113 - committed JDBC Connection 
2016-07-05 14:04:46 DEBUG JdbcTransaction:126 - re-enabling autocommit 
2016-07-05 14:04:46 DEBUG LogicalConnectionImpl:314 - Releasing JDBC connection 
2016-07-05 14:04:46 DEBUG LogicalConnectionImpl:332 - Released JDBC connection 
2016-07-05 14:04:46 DEBUG ConnectionProxyHandler:219 - HHH000163: Logical connection releasing its physical connection 
2016-07-05 14:04:46 DEBUG ConnectionProxyHandler:219 - HHH000163: Logical connection releasing its physical connection 
2016-07-05 14:04:46 DEBUG ConnectionProxyHandler:219 - HHH000163: Logical connection releasing its physical connection 
2016-07-05 14:04:46 DEBUG ConnectionProxyHandler:219 - HHH000163: Logical connection releasing its physical connection 
2016-07-05 14:04:46 INFO EncuestaController:92 - EncuestaControler despues de grabas encuesta 

Comment puis-je vérifier phrase SQL?

+0

Activez simplement la journalisation du niveau TRACE pour 'org.hibernate.SQL' afin d'obtenir la sortie SQL ou activez le paramètre de configuration' hibernate.show_sql = true'. En outre, vérifiez que les paramètres de connexion de votre base de données sont corrects et que vous utilisez la même base de données que vous inspectez dans votre outil de navigation de base de données. – Naros

+0

J'ai déjà hibernate.show_sql = true. Je peux voir d'autres sql. Mais je ne vois pas session.save (preferencia) sql ,. Cette instruction génère-t-elle une instruction SQL? – user3712581

+0

Il devrait générer une instruction 'insert', oui. Je vois que l'identifiant de séquence est ping dans vos logs mais il se comporte comme si la session en cours n'était pas limitée par la transaction générée par '@ Transactional'. Pour les grins, supprimez l'annotation '@ Transactional' et enveloppez votre code dans votre méthode avec' session.getTransaction(). Begin();/* fais tes trucs * /; session.getTransaction(). commit(); 'Si cela fonctionne, c'est un problème de câblage de limite de transaction entre' SessionFactory' et vos annotations de gestion des transactions. – Naros

Répondre

0

Si vous utilisez <tx:annotation-driven/> Vous devez définir transactionManager comme ceci:

<bean id="txManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager"> 
    <property name="sessionFactory" ref="mySessionFactory" /> 
</bean> 

L'id doit être txManager, sinon vous devez définir l'identifiant spécial pour le transactionManager comme celui-ci.

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

Et vous devriez changer votre code comme ceci @Transactional(propagation = Propagation.REQUIRED,readOnly = false). Si vous n'avez pas défini le Propagation, la valeur par défaut est SUPPORTS, s'il n'y a pas de transaction en dehors, le code s'exécutera dans la transaction. Donc, aucune transaction ne commence et aucune transaction n'est validée. Activez tout simplement @Transactional(propagation = Propagation.REQUIRED,readOnly = false)