2009-01-16 77 views
8

我得到JDBC錯誤,當我試圖通過Hibernate提交到SQL ServerHiberate問題,JDBC IDENTITY_INSERT設置爲OFF

當IDENTITY_INSERT設置爲無法插入表「報告」標識列顯式值OFF

我使用包含的NetBeans產生的映射,

<class name="orm.generated.Report" table="Report" schema="dbo" catalog="DatabaseName"> 
    <id name="id" type="int"> 
     <column name="ID" /> 
     <generator class="assigned" /> 
    </id> 

它看起來對我來說,它應該做的鑑定者正確插入。

關於如何解決這個問題的任何想法?

編輯:
一些鏈接的文檔,爲後人,
http://www.hibernate.org/hib_docs/v3/reference/en-US/html/mapping.html#mapping-declaration-id-generator
http://www.roseindia.net/hibernate/hibernateidgeneratorelement.shtml

回答

8

除非 「IDENTITY_INSERT」 設置爲 「ON」 你不能插入到SQL Server中的標識列。由於您的生成器類是「分配的」,因此Hibernate假定您在保存對象之前爲Java中的「id」設置了明確的值,並且Hibernate可以直接將該值插入到數據庫中。您需要:

  1. 選擇一個不同的生成器類,如「原生」
  2. 設置IDENTITY_INSERT爲「ON」
+0

這工作,使我到另一個錯誤,但它的作品,謝謝。 – 2009-01-20 16:37:01

+0

爲了澄清,我的意思是,通過解決這個問題,我發現了另一個問題。 – 2009-01-20 16:37:37

1

這將是最好使用包裝類如Integer,而不是原始INT。

以你的代碼爲例

<class name="orm.generated.Report" table="Report" schema="dbo" catalog="DatabaseName"> 
<id name="id" type="java.lang.Integer"> 
    <column name="ID" /> 
    <generator class="assigned" /> 
</id> 
+0

這是一個很好的做法,可以在您的帖子中添加儘可能多的相關細節。因此,在這裏你可以添加代碼示例。這會讓你的答案更有價值;) – ForceMagic 2012-10-11 06:27:57

1

這裏的東西爲我工作。根據需要調整。

@SuppressWarnings("deprecation") 
public static void saveWithOverwrittenId(Session session, Object entity) { 
    String tableName = entity.getClass().getSimpleName(); 
    boolean identityInsertSetToOn = false; 
    try { 
     session.connection().createStatement().execute("SET IDENTITY_INSERT "+tableName+" ON"); 
     identityInsertSetToOn = true; 
     session.beginTransaction(); 
     session.saveOrUpdate(entity); 
     session.getTransaction().commit(); 
    } catch (SQLException e) { 
     session.getTransaction().rollback(); 
     throw new RuntimeException(e); 
    } finally { 
     if (identityInsertSetToOn) { 
      try { 
       session.connection().createStatement().execute("SET IDENTITY_INSERT "+tableName+" OFF"); 
      } catch (SQLException e) { 
       throw new RuntimeException(e); 
      } 
     } 
    } 
} 

在我的情況下,SQL Server表具有相同的名稱作爲實體類。對你而言,這可能不是真的。然後,一種解決方案是將表名稱作爲參數。

1

改變發電機類

類型之前

<id name="id" type="long"> 
     <column name="Id" /> 
     <generator class="assigned" /> 
    </id> 

<id name="id" type="long"> 
     <column name="Id" /> 
     <generator class="native" /> 
    </id> 

現在,這將工作!

1

嘗試改變從「分配」到「身份」發電機類的類型,它爲我工作

相關問題