2016-09-18 3 views
1

я был следующим учебником по Hibernate и увидел следующий код:Hibernate сохраняется без транзакции

package com.websystique.spring.dao; 

import org.hibernate.Session; 
import org.hibernate.SessionFactory; 
import org.springframework.beans.factory.annotation.Autowired; 

public abstract class AbstractDao { 

    @Autowired 
    private SessionFactory sessionFactory; 

    protected Session getSession() { 
     return sessionFactory.getCurrentSession(); 
    } 

    public void persist(Object entity) { 
     getSession().persist(entity); 
    } 

    public void delete(Object entity) { 
     getSession().delete(entity); 
    } 
} 

Мне было интересно, если persist() (или save() или delete()) может быть использован без операции? Как кажется, это так.

+0

Замечу мимоходом, что это очень плохой код для широкого спектра причин. В идеале используйте Spring Data JPA (и используйте инъекцию конструктора). – chrylis

+0

спасибо, заглянем в те – Liumx31

ответ

1

Вы не можете сохранить или сохранить объект без транзакции, вам необходимо зафиксировать транзакцию после сохранения объекта, иначе он не будет сохранен в базе данных. Без операции можно только получить объект из базы данных

+0

, чтобы код учебника не работал? – Liumx31

1

Как сказали, что вы не можете сохранить что-либо в базе данных без активной транзакции. Он видит, что вы используете контейнер, в данном случае Spring. Весна может контролировать транзакции через перехваты, такие как JavaEE. Вы можете прочитать здесь: http://docs.jboss.org/weld/reference/2.4.0.Final/en-US/html/interceptors.html

Кроме того, это выглядит как очень плохой пример, чтобы продемонстрировать:

public class TransactionalInterceptor { 

    @Inject 
    private Session session; 

    @AroundInvoke 
    public Object logMethodEntry(InvocationContext ctx) throws Exception { 
     Object result = null; 
     boolean openTransaction = !session.getTransaction().isActive(); 
     if(openTransaction) 
      session.getTransaction().begin(); 
     try { 
      result = ctx.proceed(); 
      if(openTransaction) 
       session.getTransaction().commit(); 
     } catch (Exception e) { 
      session.getTransaction().rollback(); 
      throw new TransactionException(e); 
     } 
     return result; 
    } 

} 
Смежные вопросы