一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

Hibernate一對多和多對一關系詳解

 昵稱5370487 2011-01-17

雙向一對多關系,一是關系維護端(owner side),多是關系被維護端(inverse side)。在關系被維護端需要通過@JoinColumn建立外鍵列指向關系維護端的主鍵列。

publicclass Order implements Serializable {
    privateSet<OrderItem> orderItems = new HashSet<OrderItem>();
         。。。。
    @OneToMany(mappedBy="order",cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    @OrderBy(value = "id ASC")
    public Set<OrderItem> getOrderItems() {
        returnorderItems;
     }
}
publicclass OrderItem implements Serializable {
private Order order;
。。。。
    @ManyToOne(cascade=CascadeType.REFRESH,optional=false)
    @JoinColumn(name = "order_id")
    public Order getOrder() {
        returnorder;
     }
}
@OrderBy(value = "id ASC") 指明加載OrderItem 時按id 的升序排序
@OneToMany的屬性
1>targetEntity
定義關系類的類型,默認是該成員屬性對應的類類型,所以通常不需要提供定義。
2>mappedBy
定義類之間的雙向關系。如果類之間是單向關系,不需要提供定義,如果類和類之間形成雙向關系,我們就需要使用這個屬性進行定義,否則可能引起數(shù)據(jù)一致性的問題。
該屬性的值是“多”方class里的“一”方的變量名
3>cascade
該屬性定義類和類之間的級聯(lián)關系。定義的級聯(lián)關系將被容器視為對當前類對象及其關聯(lián)類對象采取相同的操作,而且這種關系是遞歸調用的。舉個例子:Order OrderItem有級聯(lián)關系,那么刪除Order時將同時刪除它所對應的OrderItem對象。而如果OrderItem還和其他的對象之間有級聯(lián)關系,那么這樣的操作會一直遞歸執(zhí)行下去。
cascade的值只能從CascadeType.PERSIST(級聯(lián)新建)、CascadeType.REMOVE(級聯(lián)刪除)、CascadeType.REFRESH(級聯(lián)刷新)、CascadeType.MERGE(級聯(lián)更新)中選擇一個或多個。還有一個選擇是使用CascadeType.ALL,表示選擇全部四項。
4>fatch
可選擇項包括:FetchType.EAGERFetchType.LAZY。前者表示關系類(本例是OrderItem )在主類(本例是Order)加載的時候同時加載,后者表示關系類在被訪問時才加載。默認值是FetchType.LAZY。
@JoinColumn(name = "order_id")注釋指定OrderItem映射表的order_id列作為外鍵與Order 映射表的主鍵列關聯(lián)。
@ManyToOne:指明OrderItem和Order之間為多對一關系。
@ManyToOne注釋有四個屬性:targetEntity、cascade、fetch 和optional,前三個屬性的具體含義和@OneToMany的同名屬性相同,但@ManyToOne的fetch 屬性默認值是FetchType.EAGER
optional屬性是定義該關聯(lián)類是否必須存在,值為false 時,關聯(lián)類雙方都必須存在,如果關系被維護端不存在,查詢的結果為null。值為true 時, 關系被維護端可以不存在,查詢的結果仍然會返回關系維護端,在關系維護端中指向關系被維護端的屬性為null。optional屬性的默認值是true。optional 屬性實際上指定關聯(lián)類與被關聯(lián)類的join 查詢關系,如optional=false 時join 查詢關系為inner join, optional=true 時join 查詢關系為left join。下面代碼片斷解釋如下:
有一點需要強調:當業(yè)務方法需要把一個實體Bean作為參數(shù)返回給客戶端時,除了實體Bean本身需要實現(xiàn)Serializable 接口之外,如果關聯(lián)類(OrderItem)是延遲加載,還需在返回實體Bean之前通過訪問關聯(lián)類的方式加載關聯(lián)類(見下例)。否則在客戶端訪問關聯(lián)類時將會拋出加載例外。
    public Order getOrderByID(Integer orderid) {
        Order order = em.find(Order.class, orderid);        
       //!!!!!因為是延遲加載,通過執(zhí)行size()這種方式獲取訂單下的所有訂單項
        order.getOrderItems().size();
       return order;
     }
另外不管是否延遲加載,通過join fetch 關聯(lián)語句都可顯式加載關聯(lián)類,如下例:
    public List getAllOrder() {
         Query query = em.createQuery("select DISTINCT o from Order o inner
join fetch o.orderItems order by o.orderid");
         List result = query.getResultList();
        return result;
     }

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內容均由用戶發(fā)布,不代表本站觀點。請注意甄別內容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內容,請點擊一鍵舉報。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    欧美丝袜诱惑一区二区| 欧美国产精品区一区二区三区| 五月的丁香婷婷综合网| 国产精品一区二区有码| 欧美精品亚洲精品日韩精品| 香蕉尹人视频在线精品| 亚洲一区二区三在线播放| 亚洲欧美日韩国产综合在线| 成人欧美精品一区二区三区| 在线观看中文字幕91| 国产欧美性成人精品午夜| 亚洲国产成人av毛片国产| 午夜视频成人在线免费| 精品国产一区二区欧美| 日韩人妻少妇一区二区| 手机在线观看亚洲中文字幕| 亚洲中文字幕在线视频频道| 丁香六月婷婷基地伊人| 欧美大粗爽一区二区三区| 偷自拍亚洲欧美一区二页| 可以在线看的欧美黄片| 在线观看视频日韩成人| 黄片在线免费看日韩欧美| 极品少妇嫩草视频在线观看| 午夜午夜精品一区二区| 99国产高清不卡视频| 精品国产日韩一区三区| 日韩成人中文字幕在线一区| 国产水滴盗摄一区二区| 高清一区二区三区不卡免费| 婷婷九月在线中文字幕| 欧美多人疯狂性战派对| 成人精品视频一区二区在线观看| 免费观看潮喷到高潮大叫| 五月婷婷缴情七月丁香| 日韩熟妇人妻一区二区三区| 五月天丁香婷婷狠狠爱| 久久少妇诱惑免费视频| 国产又粗又深又猛又爽又黄| 欧美av人人妻av人人爽蜜桃| 欧美日韩精品一区免费|