JBOSS 點(diǎn)滴

          豐豐的博客

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

          引起問(wèn)題的原因:

          由Hibernate根據(jù)數(shù)據(jù)庫(kù)表自動(dòng)生成的"類名.hbm.xml"映射文件引起的。

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

          int id;//主建

          String name;

          (自己做測(cè)試,所以就簡(jiǎn)單的建了個(gè)表)

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

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

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

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

          <id>這個(gè)是必須有的。它是用來(lái)定義實(shí)體的標(biāo)識(shí)屬性(對(duì)應(yīng)數(shù)據(jù)庫(kù)表的主鍵)

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

          下面是很關(guān)鍵的一點(diǎn)<generator>,由于一時(shí)興趣,于是找了很多資料,關(guān)于它的解釋是:用于指定主鍵的生成策略。它的值有多,下面是轉(zhuǎn)來(lái)的:

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

          “assigned”
          主鍵由外部程序負(fù)責(zé)生成,在   save()   之前指定一個(gè)。
             
          “hilo”
          通過(guò)hi/lo   算法實(shí)現(xiàn)的主鍵生成機(jī)制,需要額外的數(shù)據(jù)庫(kù)表或字段提供高位值來(lái)源。
             
          “seqhilo”
          與hilo   類似,通過(guò)hi/lo   算法實(shí)現(xiàn)的主鍵生成機(jī)制,需要數(shù)據(jù)庫(kù)中的   Sequence,適用于支持   Sequence   的數(shù)據(jù)庫(kù),如Oracle。
             
          “increment”
          主鍵按數(shù)值順序遞增。此方式的實(shí)現(xiàn)機(jī)制為在當(dāng)前應(yīng)用實(shí)例中維持一個(gè)變量,以保存著當(dāng)前的最大值,之后每次需要生成主鍵的時(shí)候?qū)⒋酥导?作為主鍵。這種方式可能產(chǎn)生的問(wèn)題是:不能在集群下使用。
             
          “identity”
          采用數(shù)據(jù)庫(kù)提供的主鍵生成機(jī)制。如DB2、SQL   Server、MySQL   中的主鍵生成機(jī)制。
             
          “sequence”
          采用數(shù)據(jù)庫(kù)提供的   sequence   機(jī)制生成主鍵。如   Oralce   中的Sequence。
             
          “native”
          由   Hibernate   根據(jù)使用的數(shù)據(jù)庫(kù)自行判斷采用   identity、hilo、sequence   其中一種作為主鍵生成方式。
             
          “uuid.hex”
          由   Hibernate   基于128   位   UUID   算法   生成16   進(jìn)制數(shù)值(編碼后以長(zhǎng)度32   的字符串表示)作為主鍵。
             
          “uuid.string”
          與uuid.hex   類似,只是生成的主鍵未進(jìn)行編碼(長(zhǎng)度16),不能應(yīng)用在   PostgreSQL   數(shù)據(jù)庫(kù)中。
               
          “foreign”
          使用另外一個(gè)相關(guān)聯(lián)的對(duì)象的標(biāo)識(shí)符作為主鍵。

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

          看了上面的介紹,再看看代碼,原來(lái)是<Generator>屬性設(shè)置有問(wèn)題。

          然后改為"identity"、"native"問(wèn)題便解決。



             在Hibernate中的映射文件配置中,如果在數(shù)據(jù)庫(kù)中設(shè)置一列為自動(dòng)增長(zhǎng)列,但又不是主鍵,則在配置時(shí)需要設(shè)置 property 節(jié)點(diǎn)的 "insert" 和“update” 屬性為false. 即: <property column="ID" name="id" type="int" insert="false" update="false"/>

          posted on 2014-03-16 22:20 半導(dǎo)體 閱讀(810) 評(píng)論(0)  編輯  收藏 所屬分類: Eclipse

          主站蜘蛛池模板: 久治县| 嘉禾县| 合肥市| 托克逊县| 辽阳县| 纳雍县| 栖霞市| 柳州市| 沿河| 新和县| 浮山县| 盐城市| 青冈县| 乌审旗| 淮南市| 正定县| 泗洪县| 左权县| 吉木乃县| 吉林市| 右玉县| 新和县| 虞城县| 鹤岗市| 雷波县| 光泽县| 莫力| 江津市| 绍兴市| 延安市| 灵石县| 吉首市| 镇原县| 永定县| 西平县| 景泰县| 平顶山市| 安康市| 昌黎县| 长阳| 出国|