1. 程式人生 > >註解解決Hibernate中should be mapped with insert="false" updatable=false

註解解決Hibernate中should be mapped with insert="false" updatable=false

參考:http://blog.sina.com.cn/s/blog_6829be5c01016pjj.html

在使用註解時,會遇到雙向一對多和多對一問題:

  1. 例如order與orderitem:
  2. 在order中:
  3. /*  
  4.      * @OneToMany: 指明Order 與OrderItem關聯關係為一對多關係 
  5.      *  
  6.      * mappedBy: 定義類之間的雙向關係。如果類之間是單向關係,不需要提供定義,如果類和類之間形成雙向關係,我們就需要使用這個屬性進行定義, 
  7.      * 否則可能引起資料一致性的問題。 
  8.      *  
  9.      * cascade: CascadeType[]型別。該屬性定義類和類之間的級聯關係。定義的級聯關係將被容器視為對當前類物件及其關聯類物件採取相同的操作,
     
  10.      * 而且這種關係是遞迴呼叫的。舉個例子:Order 和OrderItem有級聯關係,那麼刪除Order 時將同時刪除它所對應的OrderItem物件。 
  11.      * 而如果OrderItem還和其他的物件之間有級聯關係,那麼這樣的操作會一直遞迴執行下去。cascade的值只能從CascadeType.PERSIST(級聯新建)、 
  12.      * CascadeType.REMOVE(級聯刪除)、CascadeType.REFRESH(級聯重新整理)、CascadeType.MERGE(級聯更新)中選擇一個或多個。 
  13.      * 還有一個選擇是使用CascadeType.ALL,表示選擇全部四項。
     
  14.      *  
  15.      * fatch: 可選擇項包括:FetchType.EAGER 和FetchType.LAZY。前者表示關係類(本例是OrderItem類)在主類(本例是Order類)載入的時候 
  16.      * 同時載入;後者表示關係類在被訪問時才載入,預設值是FetchType. LAZY。 
  17.      *  
  18.      */  
  19.     @OneToMany(mappedBy = "order", cascade = CascadeType.ALL, fetch = FetchType.LAZY)  
  20.     @OrderBy(value = "id ASC")//註釋指明載入OrderItem時按id的升序排序
      
  21.     public Set<OrderItem> getOrderItems() {  
  22.         return orderItems;  
  23.     }  
  24.     public void setOrderItems(Set<OrderItem> orderItems) {  
  25.         this.orderItems = orderItems;  
  26.     }  
  27.     //@Temporal註釋用來指定java.util.Date 或java.util.Calendar 屬性與資料庫型別date,time 或timestamp 中的那一種型別進行對映  
  28.     @Temporal(value = TemporalType.TIMESTAMP)  
  29.     public Date getCreatedate() {  
  30.         return createdate;  
  31.     }  
在orderItem中:
  1. /* 
  2.      * @ManyToOne指明OrderItem和Order之間為多對一關係,多個OrderItem例項關聯的都是同一個Order物件。 
  3.      * 其中的屬性和@OneToMany基本一樣,但@ManyToOne註釋的fetch屬性預設值是FetchType.EAGER。 
  4.      *  
  5.      * optional 屬性是定義該關聯類對是否必須存在,值為false時,關聯類雙方都必須存在,如果關係被維護端不存在,查詢的結果為null。 
  6.      * 值為true 時, 關係被維護端可以不存在,查詢的結果仍然會返回關係維護端,在關係維護端中指向關係被維護端的屬性為null。 
  7.      * optional 屬性的預設值是true。舉個例:某項訂單(Order)中沒有訂單項(OrderItem),如果optional 屬性設定為false, 
  8.      * 獲取該項訂單(Order)時,得到的結果為null,如果optional 屬性設定為true,仍然可以獲取該項訂單,但訂單中指向訂單項的屬性為null。 
  9.      * 實際上在解釋Order 與OrderItem的關係成SQL時,optional 屬性指定了他們的聯接關係optional=false聯接關係為inner join,  
  10.      * optional=true聯接關係為left join。 
  11.      *  
  12.      * @JoinColumn:指明瞭被維護端(OrderItem)的外來鍵欄位為order_id,它和維護端的主鍵(orderid)連線,unique= true 指明order_id列的值不可重複。 
  13.      */  
  14.     @ManyToOne(cascade = CascadeType.REFRESH, optional = false)  
  15.     @JoinColumn(name = "order_id",referencedColumnName="orderid")  
  16.     public Order getOrder() {  
  17.         return order;  
  18.     }  
  19.     public void setOrder(Order order) {  
  20.         this.order = order;  
  21.     }  
注意:在ManyToOne中的@JoinColumn(name = "order_id",referencedColumnName="orderid"),這裡的name = "order_id"是orderitem的外來鍵,與order表的主鍵關聯,如果OrderItem類當中有個屬性叫oder_id,那麼就會報: should be mapped with insert="false" updatable=false
這是要在@JoinColumn(name = "order_id",referencedColumnName="orderid")加上insertable=false updatable=false以避免欄位重複對映