JBOSS 點滴

          豐豐的博客

          映射文件配置org.hibernate.id.IdentifierGenerationException: ids for this class must be manually assigned before calling save():

          引起問題的原因:

          由Hibernate根據數據庫表自動生成的"類名.hbm.xml"映射文件引起的。

          首先我的表(Info)由兩個字段組成,即:

          int id;//主建

          String name;

          (自己做測試,所以就簡單的建了個表)

          由Hibernate生成的Info.hbm.xml中是這樣寫的:

          -----------------------------------------------------

          <id name="id" type="java.lang.Integer">
                      <column name="id" />
                      <generator class="assigned"/>
          </id>

          -----------------------------------------------------

          <id>這個是必須有的。它是用來定義實體的標識屬性(對應數據庫表的主鍵)

          而我這里由于id本身就是主鍵,所以column的屬性便是id

          下面是很關鍵的一點<generator>,由于一時興趣,于是找了很多資料,關于它的解釋是:用于指定主鍵的生成策略。它的值有多,下面是轉來的:

          --------------------------------------------------------------------------------

          “assigned”
          主鍵由外部程序負責生成,在   save()   之前指定一個。
             
          “hilo”
          通過hi/lo   算法實現的主鍵生成機制,需要額外的數據庫表或字段提供高位值來源。
             
          “seqhilo”
          與hilo   類似,通過hi/lo   算法實現的主鍵生成機制,需要數據庫中的   Sequence,適用于支持   Sequence   的數據庫,如Oracle。
             
          “increment”
          主鍵按數值順序遞增。此方式的實現機制為在當前應用實例中維持一個變量,以保存著當前的最大值,之后每次需要生成主鍵的時候將此值加1作為主鍵。這種方式可能產生的問題是:不能在集群下使用。
             
          “identity”
          采用數據庫提供的主鍵生成機制。如DB2、SQL   Server、MySQL   中的主鍵生成機制。
             
          “sequence”
          采用數據庫提供的   sequence   機制生成主鍵。如   Oralce   中的Sequence。
             
          “native”
          由   Hibernate   根據使用的數據庫自行判斷采用   identity、hilo、sequence   其中一種作為主鍵生成方式。
             
          “uuid.hex”
          由   Hibernate   基于128   位   UUID   算法   生成16   進制數值(編碼后以長度32   的字符串表示)作為主鍵。
             
          “uuid.string”
          與uuid.hex   類似,只是生成的主鍵未進行編碼(長度16),不能應用在   PostgreSQL   數據庫中。
               
          “foreign”
          使用另外一個相關聯的對象的標識符作為主鍵。

          --------------------------------------------------------------------------------

          看了上面的介紹,再看看代碼,原來是<Generator>屬性設置有問題。

          然后改為"identity"、"native"問題便解決。



             在Hibernate中的映射文件配置中,如果在數據庫中設置一列為自動增長列,但又不是主鍵,則在配置時需要設置 property 節點的 "insert" 和“update” 屬性為false. 即: <property column="ID" name="id" type="int" insert="false" update="false"/>

          posted on 2014-03-16 22:20 半導體 閱讀(800) 評論(0)  編輯  收藏 所屬分類: Eclipse

          主站蜘蛛池模板: 温州市| 山丹县| 永善县| 禹城市| 临湘市| 阳信县| 金堂县| 宁阳县| 疏勒县| 南昌县| 昂仁县| 灵武市| 东海县| 鄢陵县| 赫章县| 呼伦贝尔市| 德昌县| 阿城市| 博爱县| 镇江市| 固始县| 五寨县| 临汾市| 山阴县| 长春市| 同江市| 大荔县| 临武县| 夹江县| 英山县| 徐汇区| 景东| 怀集县| 循化| 睢宁县| 亚东县| 乌兰浩特市| 连山| 大田县| 施秉县| 广南县|