TransactionException: nested transactions not supported

274
15 июля 2017, 07:01

Конфигурация :

  public class HibernateConfig {
private static final SessionFactory concreteSessionFactory;
private static HibernateConfig instance;
private HibernateConfig(){
}
public static HibernateConfig getInstance(){
    if(instance == null){
        instance = new HibernateConfig();
    }
    return instance;
}
static {
    try {
        Properties prop= new Properties();
        prop.setProperty("hibernate.connection.driver_class", "com.mysql.jdbc.Driver");
        prop.setProperty("hibernate.connection.url", url);
        prop.setProperty("hibernate.current_session_context_class", "thread");
        prop.setProperty("hibernate.connection.username", user);
        prop.setProperty("hibernate.connection.password", password);
        concreteSessionFactory = new AnnotationConfiguration()
                .addPackage("Main.*")
                .addProperties(prop)
                .addAnnotatedClass(Example.class)
                .buildSessionFactory();
    } catch (Throwable ex) {
        throw new ExceptionInInitializerError(ex);
    }
}

public SessionFactory sessionFactory() {
    return concreteSessionFactory;
}

}

DBService

 public class DBService {
private SessionFactory sessionFactory;

public DBService() {
    sessionFactory= HibernateConfig.getInstance().sessionFactory();
}
.......
public void updateJournalNote(JournalDataSet journalDataSet) {
    Session session = sessionFactory.getCurrentSession();
    MySqlDAO dao = new MySqlDAO(session);
    dao.updateJournalNote(journalDataSet);
}
.......
}

MySqlDAO

 public class MySqlDAO {
private Session session;
public MySqlDAO(Session session) {
    this.session = session;
}

 public void updateJournalNote(JournalDataSet journalDataSet) {
    session.beginTransaction();
    session.update(journalDataSet);
    session.getTransaction().commit();
}
}

Некоторое время после начала работает нормально, потом получаю TransactionException: nested transactions not supported в session.beginTransaction();, updateJournalNote часто вызывается, но метод что вызывает его synchronized. Перед этим возникает:

   org.hibernate.exception.ConstraintViolationException: could not execute 
   statement 
 Caused by: 
 com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: 
 Duplicate entry '2017.07.10 17:15:48-6-3000' for key 'UK_journal'

в session.beginTransaction();

Answer 1

Я не буду говорить про вторую ошибку, но расскажу про ситуацию связанную с первой.

При работе с hibernate нужно всегда учитывать такой нюанс, что транзакцию нужно закрывать даже если произошла ошибка. Во время выполнения, вы открываете транзакцию, в запросе произошла ошибка, программа ее отобразила и прошла дальше, выйдя из этого блока try/catch и вот вы снова обращаетесь к базе, снова вызываете session.beginTransaction();, а ничего не выходит. Транзакция уже открыта и hibernate пробрасывает исключение.

Другими словами, оберните типовой запрос в try/catch и откатите там транзакцию rollback().

PS Чот я забыл, а сделал ли я это в последнем сервисе...? :пошел проверять:

READ ALSO
Помогите с реализацией игры

Помогите с реализацией игры

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

226
Почему код работает в java 7 и не работает в java 8?

Почему код работает в java 7 и не работает в java 8?

Я использую в данный момент IDE Eclipse Version: Neon2 Release (4

153
Spring inline-script

Spring inline-script

Добрый деньИзучаю спринг по книге spring in action

258