2
Hibernate 4.3から5.2への移行後に、エラーが発生しました。javax.persistence.TransactionRequiredException:トランザクションが進行中ではありません。このエラーの原因は何ですか?なぜトランザクションが存在しないのですか?Hibernate 5.2.10.Final - javax.persistence.TransactionRequiredException:トランザクションが進行中ではありません
public class HibernateUtil {
private static StandardServiceRegistry registry;
private static SessionFactory sessionFactory;
private static final Logger logger = LogManager.getLogger(HibernateUtil.class);
private static final ThreadLocal<Interceptor> threadInterceptor = new ThreadLocal<>();
private static final ThreadLocal<Session> threadSession = new ThreadLocal<>();
/**
* Retrieves the current Session local to the thread.
*
* <p/>
* If no Session is open, opens a new Session for the running thread.
*
* @return Session
*/
public static Session getSession() throws InfrastructureException {
Session s = threadSession.get();
try {
if (s == null) {
if (getInterceptor() != null) {
if (logger.isDebugEnabled()) {
logger.debug("Using interceptor: " + getInterceptor().getClass());
}
s = getSessionFactory().openSession();
} else {
s = getSessionFactory().openSession();
}
threadSession.set(s);
}
} catch (HibernateException ex) {
throw new InfrastructureException(ex);
}
return s;
}
public static SessionFactory getSessionFactory() {
if (sessionFactory == null) {
try {
// Create registry
registry = new StandardServiceRegistryBuilder()
.configure()
.build();
// Create MetadataSources
MetadataSources sources = new MetadataSources(registry);
// Create Metadata
Metadata metadata = sources.getMetadataBuilder().build();
// Create SessionFactory
sessionFactory = metadata.getSessionFactoryBuilder().build();
} catch (Exception e) {
e.printStackTrace();
if (registry != null) {
StandardServiceRegistryBuilder.destroy(registry);
}
}
}
return sessionFactory;
}
private static Interceptor getInterceptor() {
return threadInterceptor.get();
}
データベース(BaseDAO)にオブジェクトを格納する一般的な方法です。 session.flush()行にエラーがスローされます。 UserDAOクラスの
protected static void storeObject(Object object) throws DAOException {
try {
Session session = Helper.getHibernateSession();
session.saveOrUpdate(object);
session.flush();
session.beginTransaction().commit();
} catch (HibernateException he) {
rollback();
throw new DAOException(he);
}
}
方法:
public void save(User user) throws DAOException {
storeObject(user);
}
hibernate.cf.xml
<session-factory>
<!-- SQL - Settings -->
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">
jdbc:mysql://localhost/test?autoReconnect=true&autoReconnectForPools=true
</property>
<property name="hibernate.connection.username">test</property>
<property name="hibernate.connection.password">test</property>
<!-- connection pool -->
<property name="hibernate.c3p0.max_size">5000</property>
<property name="hibernate.c3p0.min_size">10</property>
<property name="hibernate.c3p0.timeout">180</property>
<property name="hibernate.c3p0.max_statements">0</property>
<property name="hibernate.c3p0.idle_test_period">10</property>
<property name="hibernate.c3p0.acquire_increment">1</property>
<property name="hibernate.c3p0.validate">true</property>
<!-- use the C3P0 connection pool -->
<property name="connection.provider_class">
org.hibernate.service.jdbc.connections.internal.C3P0ConnectionProvider
</property>
<!-- Enable Hibernate's automatic session context management -->
<property name="current_session_context_class">managed</property>
<!-- Don't echo all executed SQL to stdout -->
<property name="show_sql">false</property>
<property name="hibernate.bytecode.use_reflection_optimizer">false</property>
<!-- Validate database schema on startup -->
<property name="hbm2ddl.auto">validate</property>
<!-- Mapping -->
<mapping class="org.test.data.database.beans.User"/>
</session-factory>
:代わりにこれを試してみてください。セッションセッション= HibernateUtil.getSessionFactory()のOpenSession(); try { session.beginTransaction(); session.saveOrUpdate(entityObj); session.getTransaction()。commit(); } catch(RuntimeException e){ session.getTransaction()。rollback(); e.printStackTrace(); }最後に{ session.flush(); session.close(); } – Filippo1980
トランザクションの暗黙的な使用と直接的な違いがありますか? – Filippo1980