JBOSS 點(diǎn)滴

          豐豐的博客

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

          引起問題的原因:

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

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

          int id;//主建

          String name;

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

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

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

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

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

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

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

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

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

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

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

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

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



             在Hibernate中的映射文件配置中,如果在數(shù)據(jù)庫中設(shè)置一列為自動(dò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)體 閱讀(800) 評(píng)論(0)  編輯  收藏 所屬分類: Eclipse

          主站蜘蛛池模板: 渝中区| 宾阳县| 旌德县| 文安县| 旅游| 东莞市| 松溪县| 宝清县| 淅川县| 通州区| 庆安县| 建水县| 榆中县| 喀喇沁旗| 垫江县| 梁河县| 鄯善县| 曲阳县| 松原市| 漠河县| 栾城县| 尉氏县| 定陶县| 南木林县| 潼关县| 濮阳县| 抚州市| 凤凰县| 舟山市| 阳曲县| 河津市| 页游| 旌德县| 广河县| 龙江县| 九寨沟县| 福州市| 金川县| 金塔县| 台州市| 新乡市|