Конфигурация :
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();
Я не буду говорить про вторую ошибку, но расскажу про ситуацию связанную с первой.
При работе с hibernate нужно всегда учитывать такой нюанс, что транзакцию нужно закрывать даже если произошла ошибка. Во время выполнения, вы открываете транзакцию, в запросе произошла ошибка, программа ее отобразила и прошла дальше, выйдя из этого блока try/catch
и вот вы снова обращаетесь к базе, снова вызываете session.beginTransaction();
, а ничего не выходит. Транзакция уже открыта и hibernate пробрасывает исключение.
Другими словами, оберните типовой запрос в try/catch
и откатите там транзакцию rollback()
.
PS Чот я забыл, а сделал ли я это в последнем сервисе...? :пошел проверять:
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Суть игры заключается в том, что есть 3 круга красного цвета, случайным образом выбирается один из них и закрашивается в зеленыйВ течении...
Я использую в данный момент IDE Eclipse Version: Neon2 Release (4