【転】Hbernateの「Repeated column in mapping for entity」が異常です。

4514 ワード

記事のソース:http://www.iteye.com/topic/786535
作者:lijiejava
 
一対の多双方向関連(クラスItemとクラスBid):Item類:
 
 public class Item {   
     private int id;   
     private String name;   
     private Set bids = new HashSet();  
     ,,,
 } 
 
 
Bidクラス:
 public class Bid {   
     private int id;   
     private double amount;   
     private Item item;  
     ...
} 
 
Item.hbm.xml:(tuitem表)
 
   <hibernate-mapping>  
        •••  
            <set name="bids" table="t_bid" cascade="save-update">  
                <key column="item_id" not-null="true"/>  
                <one-to-many class="value.Bid"/>  
           </set>   
         •••   
   </hibernate-mapping>  
 
 
Bid.hbm.xml:(tubid表)
   <hibernate-mapping>  
        •••  
    <many-to-one name="item" class="value.Item" column="item_id" not-null="true" />   
        •••  
   </hibernate-mapping>  
 
 
テストコード:
•••  
 Item item = new Item();  
 item.setName("item");  
           
 Bid b1 = new Bid();  
 b1.setAmount(12.09);   
 b1.setItem(item);  
           
 Bid b2 = new Bid();  
 b2.setAmount(11.98);   
 b2.setItem(item);  
           
 Set bids = new HashSet();  
 bids.add(b1);  
 bids.add(b2);  
           
 item.setBids(bids);   
           
 session.beginTransaction();    
 session.save(item);   
 session.getTransaction().commit(); 
 
これは以前の一対の多双関連です。今日の運行時は下記の異常を投げました。
 
Exception in thread "main" java.lang.ExceptionInInitializerError  
 •••  
 Caused by: org.hibernate.MappingException: Repeated column in mapping for entity: value.Bid column: item_id (should be mapped with insert="false" update="false") 
 
 
マッピングファイルを詳しく調べたら、Item.hbm.xmlプロファイルの「key」要素の中に一つのnot-null=「true」の制限が追加されていることが分かりました。これを取り除いたら正常に動作します。(1)not-null=「true」に加入すると何を意味しますか?「key」要素で定義された列マップitem_idはt_ですbidテーブルの外結合列。not-null="true"に加入すると、t_を増やすという意味です。bidテーブルの記録は、外接キー列item_IDは必ずnullではなく、Item端はitemを確保するためにIDフィールドはnullではありません。(Item端はBid端を知らないので、Bid端に依存してitemyuidを確保することは不可能です。)t_にあります。bidの挿入文には、このフィールドに値が割り当てられます。実は、一方向のペアが多いか、それとも双方向のペアが多いかに関わらず、「key」要素にnot-null=「true」が設定されているなら、t_bid表のinsert文には、column属性で指定された列(ここではitemuid)が追加されます。IDは空にならない一方向の一対のマルチ関連を例にとって、not-null="true"が設定されていない場合、出力される語句は、Hbernate:insert into t_bid(amount)values(?);not-null=「true」を設定したら、出力する語句はハイビスカス:insert into_bid(amount、itemuuid)values(?)。(2)異常な原因を打ち出す?異常の原因は、異常情報からフィールドが重複していることが分かります。(1)の分析によって、その原因がよく分かります。Bid.hbm.xmlマッピングファイルを参照してください。これは複数のペアの関連であり、not-null="true"Bidがそのエンティティに対応していることを示しています。column属性指定t_bid表中item_id列はt_ですitem表のメインキーの外形キーです。Bidにとって、not-null=「true」が指定されていても、そのinsert文はitem(u)となります。IDフィールドの値は、nullでも与えられます。これが異常発生の原因であり、このような設定はハイビスカスにinsert into t_を発生させます。bit(itemuuid、itemuuid)values(•••)の文なので、重複フィールドの異常を提示します。(3)解決:1.要素の中のnot-null="true"を削除し、実際には双方向の関連においてItem側から外殻キー列item(u)を確保する必要はありません。idはnullではない2.ヒントに従い、Bid.hbm.xmlマッピングファイルにinsert=「false」udate=「false」を追加することができます。この二つの制限を加えると、t_に対して意味があります。bidテーブルのinsertとudateの操作にはこのフィールドが含まれていないので、重複を避けることができます。3.Item.hbm.xmlの「set」要素にinverse=「true」を入れて、関連関係を全部Bid端に渡す。http://lijiejava.iteye.com/blog/7765874.最もつまらない方法:「key」要素の中のcolumn値をitem_に変更する。id_1等、アイテムとはIDが重複すると、データテーブルフィールドの冗長性が発生しますので、使用してはいけません。実際の応用では、「key」にnot-null=「true」の制限を加えるべきではない。
 
 
 
 
 
====================================================================================================================
 
この問題はXMLと注釈を書く時に会ったことがありますか?しかも非常に頻繁です。
この招待状を通して、データベースの外部キーが空であることも再度説明しました。
以下はデータベースの外部キーに関するいくつかのスレッドです。
http://topic.csdn.net/u/20070525/00/523a0ee7-6d80-404d-ab70-fdd4920b9c45.html
http://blog.csdn.net/wkupaochuan/article/details/7633173
http://gwj41.iteye.com/blog/643467