[英]Using an existing JDBC connection object with Hibernate
I am trying to get Hibernate to connect to my MariaDB-database using an existing Connection-object that I either grab from a Tomcat connection pool or create via DriverManager.getConnection(...)
.我试图让 Hibernate 使用现有的 Connection 对象连接到我的 MariaDB 数据库,我要么从 Tomcat 连接池中获取该对象,要么通过DriverManager.getConnection(...)
创建该对象。 Both ways work, I receive a Connection object that I can perform both read and write operations with.这两种方式都可以工作,我收到一个 Connection 对象,我可以用它执行读写操作。 Now I want to supply these objects to Hibernate.现在我想将这些对象提供给 Hibernate。 I've chosen to do that like so:我选择这样做:
public class SessionFactoryService implements ISessionFactoryService {
private SessionFactory sessionFactory = null;
private final Connection connection;
@Inject
public SessionFactoryService(Connection connection){
this.connection = connection;
}
public Session getSession(){
SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
SessionBuilder sb = sessionFactory.withOptions();
return sb.connection(connection).openSession();
}}
When I call getSession()
, I get a valid Session-object on which I can perform select-Statements in Hibernate.当我调用getSession()
,我得到一个有效的 Session 对象,我可以在 Hibernate 中对其执行 select-Statements。 However, when i try to call session.persist(someobj)
, i get the following exception:但是,当我尝试调用session.persist(someobj)
,出现以下异常:
Exception in thread "main" java.lang.UnsupportedOperationException: The application must supply JDBC connections
I have searched for people who've had the same issue for hours now without success, any help is greatly appreciated!我已经搜索了几个小时以来遇到同样问题的人,但没有成功,非常感谢任何帮助!
EDIT1:编辑1:
My hibernate configuration looks like this:我的休眠配置如下所示:
<?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 = "hibernate.dialect">
org.hibernate.dialect.MySQLDialect
</property>
<mapping class="com.xxx.yyy.Object"></mapping>
</session-factory>
</hibernate-configuration>
I am only setting the dialect in the hibernate.cfg.xml
since the connection objects are already set up externally.我只在hibernate.cfg.xml
设置方言,因为已经在外部设置了连接对象。
The full stack trace looks like this:完整的堆栈跟踪如下所示:
Exception in thread "main" java.lang.UnsupportedOperationException: The application must supply JDBC connections
at org.hibernate.engine.jdbc.connections.internal.UserSuppliedConnectionProviderImpl.getConnection(UserSuppliedConnectionProviderImpl.java:44)
at org.hibernate.internal.NonContextualJdbcConnectionAccess.obtainConnection(NonContextualJdbcConnectionAccess.java:35)
at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcIsolationDelegate.delegateWork(JdbcIsolationDelegate.java:48)
at org.hibernate.id.enhanced.TableStructure$1.getNextValue(TableStructure.java:125)
at org.hibernate.id.enhanced.NoopOptimizer.generate(NoopOptimizer.java:40)
at org.hibernate.id.enhanced.SequenceStyleGenerator.generate(SequenceStyleGenerator.java:452)
at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:105)
at org.hibernate.event.internal.DefaultPersistEventListener.entityIsTransient(DefaultPersistEventListener.java:189)
at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:132)
at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:58)
at org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:782)
at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:767)
at com.xxx.yyy.ServiceA.create(ServiceA.java:75)
at com.xxx.yyy.App.main(App.java:60)
Try尝试
return sb.openStatelessSession(connection);
or或者
sessionFactory.withOptions().connection(Connection conn);
return sb.openSession();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.