Завершение сеанса с Hibernate и Спринг

Я хочу знать: Как закрывать сеанс hibernate, если я манипулирую сделкой со Спринг 4.x?.

Модель

import java.util.Date;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
@Entity
@Table(name="EGRESOS")
public class Egreso {
    @Id
    @GeneratedValue
    @Column(name="id")
    private Long id;
    @Temporal (TemporalType.DATE)
    @Column(name="fecha")
    private Date fecha;
    @Column(name="importe")
    private Double importe;
    @Column(name="detalle")
    private String detalle;

    public Egreso() {
        // TODO Auto-generated constructor stub
    }

//all getters and setters

Настойчивость

public abstract class CustomHibernateSupport<T> extends HibernateDaoSupport implements IGenericDAO<T> {
    private Class<T> persistentClass;
    @Autowired
    private SessionFactory sessionFactory;

    @SuppressWarnings({ "unchecked", "deprecation" })
    public CustomHibernateSupport() {
        this.persistentClass = (Class<T>) ((ParameterizedType) getClass()
                .getGenericSuperclass()).getActualTypeArguments()[0];
        this.sessionFactory = new Configuration().configure() // configures
                                                                // settings from
                                                                // hibernate.cfg.xml
        .buildSessionFactory();
    }

    @PostConstruct
    public void init(){
        setSessionFactory(sessionFactory);
        getHibernateTemplate().setCacheQueries(true);
    }

    public Class<T> getPersistentClass() {
        return persistentClass;
    }

    public void setPersistentClass(Class<T> persistentClass) {
        this.persistentClass = persistentClass;
    }

    public void insert(T entity) {
        getHibernateTemplate().save(entity);
    }

    public void delete(T entity) {
        getHibernateTemplate().delete(entity);    
    }

    public void update(T entity){
        getHibernateTemplate().update(entity);
    }

    @SuppressWarnings("unchecked")
    public List<T> findAll() {
        Session session = getSessionFactory().openSession();
        Criteria cr = session.createCriteria(getPersistentClass());

        return cr.list();
    }

    @SuppressWarnings("unchecked")
    public T findById(Long id) {
        Session session = getSessionFactory().openSession();
        Criteria criteria= session.createCriteria(getPersistentClass());
                 criteria.add(Restrictions.eq("id",id));                 
        return (T) criteria.uniqueResult();
    }

    @SuppressWarnings("unchecked")
    public List<T> findByDate(Date date) {
        System.out.println(date);
        Session session = getSessionFactory().openSession();
        Criteria criteria= session.createCriteria(getPersistentClass());
                 criteria.add(Restrictions.eq("fecha",date));

        return  criteria.list();
    }
}

Услуга

@Transactional(readOnly=false)
public boolean cargarGasto(GastosRequestDTO nuevo){
    Egreso e = new Egreso();
    try{
            e.setDetalle(nuevo.getDetalle());
            e.setFecha(nuevo.getFecha());
            e.setImporte(nuevo.getImporte());
            egreso.insert(e);
            log.info("se inserto correctamente el nuevo gasto ID: "+ e.getId());
            return true;
    }
    catch(Exception ex){
        log.error(Throwables.getStackTraceAsString(ex));
        log.error("No se pudo insertar gasto ");
    }
    return false;
}

Драйвер

public void cargarGasto() {
        GastosRequestDTO nuevoGasto = new GastosRequestDTO();
        nuevoGasto.setFecha(fecha);
        nuevoGasto.setDetalle(descripcion);
        nuevoGasto.setImporte(importe);
        if (hotel.cargarGastos(nuevoGasto)) {
            obtenerBalance();
            setImporte(null);
            setDescripcion(null);

    }
}

ApplicattionContex.xml

<context:annotation-config/>
<context:component-scan base-package="ar.com.as.hotel"/>
<bean id="recordDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
    lazy-init="true" destroy-method="close">

    <property name="driverClass" value="org.gjt.mm.mysql.Driver" />

    <!-- CHANGE THE DATABASE CONNECTION-->
    <property name="jdbcUrl" value="jdbc:mysql://127.0.0.1:3306/hotelTest"/>        
    <property name="user" value="********" />
    <property name="password" value="********" />
    <!-- ***************************************** -->

    <property name="minPoolSize" value="1" />
    <property name="maxPoolSize" value="100" />
    <property name="initialPoolSize" value="5" />
</bean>
<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
    <property name="configLocation">
        <value>./WEB-INF/classes/hibernate.cfg.xml</value>
    </property>
    <property name="dataSource">
        <ref bean="recordDataSource" />
    </property>
</bean>
<bean id="transactionManager"
    class="org.springframework.orm.hibernate4.HibernateTransactionManager">
    <property name="sessionFactory">
        <ref local="sessionFactory" />
    </property>
</bean>
<tx:annotation-driven transaction-manager="transactionManager" />

Hibernate.xml

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-configuration SYSTEM
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="connection.url">jdbc:mysql://127.0.0.1:3306/hotel***</property>
        <property name="connection.username">******</property>
        <property name="connection.password">******</property>
        <property name="hbm2ddl.auto">update</property>
        <property name="connection.autocommit">false</property>

<!--        <mapping resource="Cliente.hbm.xml" /> -->

        <mapping class="ar.com.as.hotel.modelo.Ingreso" ></mapping>
        <mapping class="ar.com.as.hotel.modelo.Precio"></mapping>
        <mapping class="ar.com.as.hotel.modelo.Habitacion"></mapping>
        <mapping class="ar.com.as.hotel.modelo.Temporada"></mapping>
        <mapping class="ar.com.as.hotel.modelo.Egreso"></mapping>


        <!-- List of XML mapping files -->

    </session-factory>
</hibernate-configuration>
4
задан 16.03.2017, 19:14
2 ответа

Она sesiГіn он будет закрываться одинокая. Спринг Трэнсэкшн будет манипулировать ею из-за тебя. Только asegГєrate, что они mГ©todos, что нуждались в связности в базу данных и использовали Hibernate estГ©n отмеченные правильно с @Transactional, или который estГ©n конфигурировавшие vГ - в xml.

9
ответ дан 01.12.2019, 08:18
  • 1
    Это - то, что я думал Luiggi, но из-за какого-то raz и # 243; n он не закрывает. Есть способ вынуждать завершение? – Santi92 01.12.2015, 19:48
  • 2
    Как дела звоня в метод cargarGasto? –  01.12.2015, 19:49
  • 3
    С драйвера, я звоню в этот метод там прикрепляю вызов – Santi92 01.12.2015, 19:55
  • 4
    Пожалуйста издай твой вопрос и покажи код. Убедись также добавления опоры transaccionabilidad раньше в xml configuration или пути аннотации, если все программное. Он был бы гениальным, если tambirn ты добавляешь конфигурацию spring в проекте. –  01.12.2015, 19:57
  • 5
    Я верю в то, что ах и # 237; qued и # 243; м и # 225; s яичный белок edici и # 243; n – Santi92 01.12.2015, 20:22

Поскольку я это вижу, именно больше совсем не проблема тебя configuraciГіn, он действительно старается перемешивать груши с яблоками.

я Ты могу decri, что файл Hibernate.xml - больше, так как у тебя сейчас есть файл configuraciГіn со Спринг, который подает тебя для того же самого.

Лучшее состоит в том, чтобы ты сказал Спринг, что твои организации находятся в таком пакете, и верит тебе в единицу настойчивости, в которой ты нуждаешься, так уже ты не будешь должен быть добавляя каждую из организаций, которые ты производишь в файл.

Восток - пример.

<bean id="entityManagerFactory"
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="persistenceUnitName" value="persistenceUnit" />
    <property name="packagesToScan">
        <list>
            <value>com.todo.model</value>
        </list>
    </property>
    <property name="dataSource" ref="dataSource" />
    <property name="jpaVendorAdapter">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
            <property name="databasePlatform" value="org.hibernate.dialect.MySQLDialect" />
            <property name="showSql" value="true" />
        </bean>
    </property>
    <property name="jpaProperties">
        <props>
            <prop key="hibernate.hbm2ddl.auto">update</prop>
        </props>
    </property>
</bean>

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

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

<mvc:annotation-driven />

<context:component-scan base-package="com.todo" />  

AquГ - вопрос, чтобы предотвращать файл persistence.xml, который является эквивалентом твоему файлу Hibernate.

https://stackoverflow.com / questions / 21381943/how-to-configure-spring-without-persistence-xml

И aquГ - проект с нею configuraciГіn уже сделанная

https://github.com/ripper2hl/angular-todo

1
ответ дан 01.12.2019, 08:18