簡體   English   中英

在 Hibernate 中使用現有的 JDBC 連接對象

[英]Using an existing JDBC connection object with Hibernate

我試圖讓 Hibernate 使用現有的 Connection 對象連接到我的 MariaDB 數據庫,我要么從 Tomcat 連接池中獲取該對象,要么通過DriverManager.getConnection(...)創建該對象。 這兩種方式都可以工作,我收到一個 Connection 對象,我可以用它執行讀寫操作。 現在我想將這些對象提供給 Hibernate。 我選擇這樣做:

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();
}}

當我調用getSession() ,我得到一個有效的 Session 對象,我可以在 Hibernate 中對其執行 select-Statements。 但是,當我嘗試調用session.persist(someobj) ,出現以下異常:

Exception in thread "main" java.lang.UnsupportedOperationException: The application must supply JDBC connections

我已經搜索了幾個小時以來遇到同樣問題的人,但沒有成功,非常感謝任何幫助!

編輯1:

我的休眠配置如下所示:

<?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>

我只在hibernate.cfg.xml設置方言,因為已經在外部設置了連接對象。

完整的堆棧跟蹤如下所示:

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)

嘗試

 return sb.openStatelessSession(connection);

或者

 sessionFactory.withOptions().connection(Connection conn);
 return sb.openSession();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM