2016-07-05 62 views
1

我的工作與Spring MVC的3.2.6,休眠4,甲骨文和WebLogic 10.3.6SessionFactory的Hibernate不提交Oracle數據庫

我想在Oracle數據庫提交使用Hibernate和JPA一個實體。在服務器控制檯中,我看不到錯誤。但是當我檢查Oracle表時,不記錄新記錄。

這是我的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; 
    } 

} 

服務類AdministrationService.java.I使用方法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,我打電話給createPreferencia方法是

administrationService.createPreferencia(preferencia); 

控制檯服務器消息

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 

如何檢查SQL語句?

+0

只需爲'org.hibernate.SQL'啓用TRACE級別日誌記錄即可獲取輸出SQL或啓用配置設置'hibernate.show_sql = true'。此外,請驗證您的數據庫連接設置是否正確,並且您正在使用數據庫瀏覽工具中正在檢查的數據庫。 – Naros

+0

我已經hibernate.show_sql = true。我可以看到其他人的SQL。但我沒有看到session.save(preferencia)sql。該指令是否生成SQL指令? – user3712581

+0

它應該生成一個'insert'語句,是的。我看到序列標識符在日誌中被ping通,但它的行爲好像當前會話不受'@ Transactional'生成的事務的約束。對於笑臉,刪除'@ Transactional'註釋並用'session.getTransaction()。begin();/*做你的東西* /; session.getTransaction()。commit();'如果可行,這是'SessionFactory'和您的事務管理註釋之間的事務邊界接線問題。 – Naros

回答

0

如果使用<tx:annotation-driven/> 您必須定義transactionManager的是這樣的:

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

的ID必須是txManager,否則你應該定義特殊的ID爲transactionManager的這個樣子。

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

而你應該改變你這樣的代碼@Transactional(propagation = Propagation.REQUIRED,readOnly = false)。 如果您未定義Propagation,則默認值爲SUPPORTS,如果沒有外部事務,則代碼將在事務中執行。所以沒有事務開始,也沒有事務提交。 總之,只需使用@Transactional(propagation = Propagation.REQUIRED,readOnly = false)