環境:Tomcat 5.5 + Struts + Hibernate 2.1 + jTDS JDBC + SQL Server 2000
[ERROR] TableGenerator - could not read a hi value
java.sql.SQLException: 第 1 行: FOR UPDATE 子句僅允許用於 DECLARE CURSOR。
native 讓 Hibernate 自動選擇策略,SQL Server 下退回 TableGenerator (Hi/Lo 演算法),產生 SELECT ... FOR UPDATE 鎖定資料列,但 jTDS 驅動不支援此語法。
[ERROR] ReflectHelper - IllegalArgumentException in class: User, setter method of property: userid
expected type: java.lang.Integer, actual value: java.lang.Long
SQL Server IDENTITY 欄位回傳 java.lang.Long,但實體類別主鍵定義為 Integer,導致設值失敗。
increment 由 Hibernate 在記憶體中遞增,內部邏輯同樣產生 Long 值,同樣報錯。
// 修改前
private Integer userid;
// 修改後
private Long userid;
<id column="userid" name="userid" type="long">
<generator class="increment"/> <!-- 或 identity -->
</id>
執行成功,increment 與 identity 皆正常運作。
IdentifierGenerator) 介面回傳 Serializable,具體實作多以 Long 為基礎型別IDENTITY 欄位透過 JDBC getGeneratedKeys() 取得時,jTDS 驅動回傳 Longincrement 策略的 IncrementGenerator 內部計數器為 long,生成 Long 物件Long (或 long),避免型別轉換失敗Long,相容性最佳identity (資料庫層面保證唯一),搭配 generator class="identity"native 配合 Long 主鍵是較安全選擇 (需驅動支援 FOR UPDATE 或替代鎖定機制)increment 於叢集環境 (記憶體計數器不同步會產生重複鍵值)