首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

解決 Hibernate 在 SQL Server 2000 中父子關係同時保存的 JDBC 連接問題

     編輯:關於SqlServer

問題背景

在使用 Hibernate 操作 SQL Server 2000 時,若實體之間存在雙向一對多關係(如 TransOrder 与 OrderItem),並在同一事務中級聯保存父子對象,可能會拋出如下異常:

[Microsoft][SQLServer 2000 Driver for JDBC]Can't start a cloned connection while in manual transaction mode.

錯誤原因

此問題源於 Microsoft JDBC 驅動程式的預設行為。當連接處於手動事務模式(AutoCommit=false)且使用 SelectMethod=direct(預設值)時,驅動不允許在同一連接上並發執行多個 Statement。Hibernate 在級聯保存時會產生多條 SQL 語句,導致衝突。

解決方案

將 JDBC 連接 URL 中的 SelectMethod 屬性設為 cursor,即可允許在手動事務中複用連接執行多條語句。

配置範例

<property name="hibernate.connection.url">
    jdbc:microsoft:sqlserver://localhost:1433;SelectMethod=cursor;DatabaseName=yourdb
</property>

注意: 建議同時修改 hibernate.cfg.xml 和 Hibernate Synchronizer 產生的 .hibernateSynchronizer 文件,確保所有環境一致。

映射配置參考

<!-- TransOrder.hbm.xml -->
<set name="orderItems" table="orderitem" lazy="false" inverse="true" cascade="all">
    <key column="Order_ID" />
    <one-to-many class="com.kaoyanhelper.dao.OrderItem" />
</set>

<!-- OrderItem.hbm.xml -->
<class name="OrderItem" table="OrderItem">
    <id name="id" column="OrderItem_ID" type="java.lang.Integer">
        <generator class="identity" />
    </id>
    <many-to-one name="transOrder" class="com.xx.dao.TransOrder" column="Order_ID" />
</class>

測試代碼片段

Session session = HibernateUtil.currentSession();
Transaction tx = session.beginTransaction();
TransOrder order = new TransOrder();
order.setAcceptType("www");
order.setAddress("tom");
order.setCity("changzhou");

OrderItem item = new OrderItem();
item.setItemCount(100);
item.setItemMoney("1200.2");
item.setItemType("kysj");
item.setPaperitemId(101);
item.setResourceitemId(102);

order.getOrderItems().add(item);
item.setTransOrder(order); // 維護雙向關係

session.save(order);
tx.commit();
HibernateUtil.closeSession();

應用上述配置後,即可順利完成父子對象的級聯持久化。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved