【问题标题】:SessionFactory Hibernate doesn't commit Oracle databaseSessionFactory Hibernate 不提交 Oracle 数据库
【发布时间】:2016-11-07 06:46:22
【问题描述】:

我使用 Spring MVC 3.2.6、Hibernate 4、Oracle 和 weblogic 10.3.6

我想在 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.我使用方法 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");
    }   

}

我调用 createPreferencia 方法的 Java 是

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语句?

【问题讨论】:

  • 只需为org.hibernate.SQL 启用 TRACE 级别日志记录,以获取输出 SQL 或启用配置设置 hibernate.show_sql=true。此外,请验证您的数据库连接设置是否正确,并且您使用的数据库与您在数据库浏览工具中检查的数据库相同。
  • 我已经 hibernate.show_sql=true。我可以看到别人的sql。但我没有看到 session.save(preferencia) sql,。此指令是否生成 SQL 指令?
  • 它应该生成一个insert 语句,是的。我看到在您的日志中 ping 了序列标识符,但它的行为好像当前会话不受 @Transactional 生成的事务的限制。对于 grins,删除 @Transactional 注释并使用 session.getTransaction().begin(); /* do your stuff */; session.getTransaction().commit(); 将您的代码包装在您的方法中。如果可行,这是 SessionFactory 和您的事务管理注释之间的事务边界布线问题。
  • 我必须修改一个旧项目,它不使用 session.getTransaction。它在 hibernate-context.xml 中定义了一个事务管理器。现在我在家,没有我的项目
  • 在 spring xml 中我没有 。这可能是错误吗?

标签: oracle hibernate sessionfactory


【解决方案1】:

如果你使用<tx:annotation-driven/> 您必须像这样定义 transactionManager:

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

id必须是txManager,否则你应该像这样为transactionManager定义特殊的id。

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

您应该像这样@Transactional(propagation = Propagation.REQUIRED,readOnly = false) 更改您的代码。 如果没有定义Propagation,默认值为SUPPORTS,如果外面没有事务,代码会在事务中执行。所以没有事务开始,也没有事务提交。 总而言之,只需使用@Transactional(propagation = Propagation.REQUIRED,readOnly = false)

【讨论】:

    猜你喜欢
    • 2011-12-14
    • 2011-01-01
    • 2012-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-16
    相关资源
    最近更新 更多