Jpa級聯(lián)操作

Jpa級聯(lián)操作

級聯(lián)web
記JPA一個問題,Multiple representations of the same entity [XXX#1] are being merged.

實體關(guān)系之@OneToMany
博客分類: hibernate & ejb
SQL
Order.java
Java代碼 收藏代碼

package com.entity;  
  
import java.io.Serializable;  
import java.util.Date;  
import java.util.HashSet;  
import java.util.Set;  
  
import javax.persistence.CascadeType;  
import javax.persistence.Column;  
import javax.persistence.Entity;  
import javax.persistence.FetchType;  
import javax.persistence.GeneratedValue;  
import javax.persistence.Id;  
import javax.persistence.OneToMany;  
import javax.persistence.OrderBy;  
import javax.persistence.Table;  
import javax.persistence.Temporal;  
import javax.persistence.TemporalType;  
  
@Entity  
@Table(name = "Orders")  
public class Order implements Serializable {  
      
    private Integer orderid;//訂單號  
    private Float amount;//訂單金額  
    private Set<OrderItem> orderItems = new HashSet<OrderItem>();//訂單項  
    private Date createdate;//訂單創(chuàng)建日期  
  
    @Id  
    @GeneratedValue  
    public Integer getOrderid() {  
        return orderid;  
    }  
  
    public void setOrderid(Integer orderid) {  
        this.orderid = orderid;  
    }  
      
    @Column(name="amount")//name: 映射的列名,如果不指定映射列名,容器默認將屬性名稱作為的映射的數(shù)據(jù)庫表列名塞琼。  
    public Float getAmount() {  
        return amount;  
    }  
  
    public void setAmount(Float amount) {  
        this.amount = amount;  
    }  
      
    /*  
     * @OneToMany: 指明Order 與OrderItem關(guān)聯(lián)關(guān)系為一對多關(guān)系 
     *  
     * mappedBy: 定義類之間的雙向關(guān)系董济。如果類之間是單向關(guān)系,不需要提供定義灰追,如果類和類之間形成雙向關(guān)系闪金,我們就需要使用這個屬性進行定義叼屠, 
     * 否則可能引起數(shù)據(jù)一致性的問題瞳腌。 
     *  
     * cascade: CascadeType[]類型。該屬性定義類和類之間的級聯(lián)關(guān)系镜雨。定義的級聯(lián)關(guān)系將被容器視為對當前類對象及其關(guān)聯(lián)類對象采取相同的操作嫂侍, 
     * 而且這種關(guān)系是遞歸調(diào)用的。舉個例子:Order 和OrderItem有級聯(lián)關(guān)系荚坞,那么刪除Order 時將同時刪除它所對應的OrderItem對象挑宠。 
     * 而如果OrderItem還和其他的對象之間有級聯(lián)關(guān)系,那么這樣的操作會一直遞歸執(zhí)行下去颓影。cascade的值只能從CascadeType.PERSIST(級聯(lián)新建)各淀、 
     * CascadeType.REMOVE(級聯(lián)刪除)、CascadeType.REFRESH(級聯(lián)刷新)诡挂、CascadeType.MERGE(級聯(lián)更新)中選擇一個或多個碎浇。 
     * 還有一個選擇是使用CascadeType.ALL,表示選擇全部四項璃俗。 
     *  
     * fatch: 可選擇項包括:FetchType.EAGER 和FetchType.LAZY奴璃。前者表示關(guān)系類(本例是OrderItem類)在主類(本例是Order類)加載的時候 
     * 同時加載;后者表示關(guān)系類在被訪問時才加載,默認值是FetchType. LAZY。 
     *  
     */  
    @OneToMany(mappedBy = "order", cascade = CascadeType.ALL, fetch = FetchType.LAZY)  
    @OrderBy(value = "id ASC")//注釋指明加載OrderItem時按id的升序排序  
    public Set<OrderItem> getOrderItems() {  
        return orderItems;  
    }  
  
    public void setOrderItems(Set<OrderItem> orderItems) {  
        this.orderItems = orderItems;  
    }  
      
    //@Temporal注釋用來指定java.util.Date 或java.util.Calendar 屬性與數(shù)據(jù)庫類型date,time 或timestamp 中的那一種類型進行映射  
    @Temporal(value = TemporalType.TIMESTAMP)  
    public Date getCreatedate() {  
        return createdate;  
    }  
  
    public void setCreatedate(Date createdate) {  
        this.createdate = createdate;  
    }  
      
    /* 
     * 添加訂單 
     */  
    public void addOrderItem(OrderItem orderitem) {  
        if (!this.orderItems.contains(orderitem)) {  
            this.orderItems.add(orderitem);  
            orderitem.setOrder(this);  
        }  
    }  
  
    /* 
     * 刪除訂單 
     */  
    public void removeOrderItem(OrderItem orderitem) {  
        orderitem.setOrder(null);  
        this.orderItems.remove(orderitem);  
    }  
}  

OrderItem.java
Java代碼 收藏代碼

package com.entity;  
  
import java.io.Serializable;  
  
import javax.persistence.CascadeType;  
import javax.persistence.Column;  
import javax.persistence.Entity;  
import javax.persistence.GeneratedValue;  
import javax.persistence.Id;  
import javax.persistence.JoinColumn;  
import javax.persistence.ManyToOne;  
import javax.persistence.Table;  
  
@Entity  
@Table(name = "OrderItems")//name = "OrderItems"城豁,表示本實體對應數(shù)據(jù)庫表 OrderItems苟穆,可選。  
public class OrderItem implements Serializable {  
      
    private Integer id;//作為主鍵  
    private String productname;//產(chǎn)品名稱  
    private Float price;//價格  
    private Order order;//對應的訂單  
  
    /* 
     * 無參數(shù)構(gòu)造器可別忘了 
     */  
    public OrderItem() {  
    }  
      
    /* 
     * 帶參數(shù)的構(gòu)造器唱星,用于初始化實例變量 
     */  
    public OrderItem(String productname, Float price) {  
        this.productname = productname;  
        this.price = price;  
    }  
  
    @Id  
    @GeneratedValue  
    public Integer getId() {  
        return id;  
    }  
  
    public void setId(Integer id) {  
        this.id = id;  
    }  
  
    @Column(name="productname")  
    public String getProductname() {  
        return productname;  
    }  
  
    public void setProductname(String productname) {  
        this.productname = productname;  
    }  
      
    @Column(name="price")  
    public Float getPrice() {  
        return price;  
    }  
  
    public void setPrice(Float price) {  
        this.price = price;  
    }  
  
    /* 
     * @ManyToOne指明OrderItem和Order之間為多對一關(guān)系雳旅,多個OrderItem實例關(guān)聯(lián)的都是同一個Order對象。 
     * 其中的屬性和@OneToMany基本一樣间聊,但@ManyToOne注釋的fetch屬性默認值是FetchType.EAGER岭辣。 
     *  
     * optional 屬性是定義該關(guān)聯(lián)類對是否必須存在,值為false時甸饱,關(guān)聯(lián)類雙方都必須存在沦童,如果關(guān)系被維護端不存在,查詢的結(jié)果為null叹话。 
     * 值為true 時, 關(guān)系被維護端可以不存在偷遗,查詢的結(jié)果仍然會返回關(guān)系維護端,在關(guān)系維護端中指向關(guān)系被維護端的屬性為null驼壶。 
     * optional 屬性的默認值是true氏豌。舉個例:某項訂單(Order)中沒有訂單項(OrderItem),如果optional 屬性設(shè)置為false热凹, 
     * 獲取該項訂單(Order)時泵喘,得到的結(jié)果為null泪电,如果optional 屬性設(shè)置為true,仍然可以獲取該項訂單纪铺,但訂單中指向訂單項的屬性為null相速。 
     * 實際上在解釋Order 與OrderItem的關(guān)系成SQL時,optional 屬性指定了他們的聯(lián)接關(guān)系optional=false聯(lián)接關(guān)系為inner join,  
     * optional=true聯(lián)接關(guān)系為left join鲜锚。 
     *  
     * @JoinColumn:指明了被維護端(OrderItem)的外鍵字段為order_id突诬,它和維護端的主鍵(orderid)連接,unique= true 指明order_id列的值不可重復。 
     */  
    @ManyToOne(cascade = CascadeType.REFRESH, optional = false)  
    @JoinColumn(name = "order_id",referencedColumnName="orderid")  
    public Order getOrder() {  
        return order;  
    }  
  
    public void setOrder(Order order) {  
        this.order = order;  
    }  
}  

Java你會用芜繁,但這10點實戰(zhàn)經(jīng)驗你一定不知道旺隙!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市骏令,隨后出現(xiàn)的幾起案子蔬捷,更是在濱河造成了極大的恐慌,老刑警劉巖榔袋,帶你破解...
    沈念sama閱讀 216,324評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件抠刺,死亡現(xiàn)場離奇詭異,居然都是意外死亡摘昌,警方通過查閱死者的電腦和手機速妖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來聪黎,“玉大人罕容,你說我怎么就攤上這事「迨危” “怎么了锦秒?”我有些...
    開封第一講書人閱讀 162,328評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長喉镰。 經(jīng)常有香客問我旅择,道長,這世上最難降的妖魔是什么侣姆? 我笑而不...
    開封第一講書人閱讀 58,147評論 1 292
  • 正文 為了忘掉前任生真,我火速辦了婚禮,結(jié)果婚禮上捺宗,老公的妹妹穿的比我還像新娘柱蟀。我一直安慰自己,他們只是感情好蚜厉,可當我...
    茶點故事閱讀 67,160評論 6 388
  • 文/花漫 我一把揭開白布长已。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪术瓮。 梳的紋絲不亂的頭發(fā)上康聂,一...
    開封第一講書人閱讀 51,115評論 1 296
  • 那天,我揣著相機與錄音胞四,去河邊找鬼恬汁。 笑死,一個胖子當著我的面吹牛撬讽,可吹牛的內(nèi)容都是我干的蕊连。 我是一名探鬼主播悬垃,決...
    沈念sama閱讀 40,025評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼游昼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了尝蠕?” 一聲冷哼從身側(cè)響起烘豌,我...
    開封第一講書人閱讀 38,867評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎看彼,沒想到半個月后廊佩,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,307評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡靖榕,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,528評論 2 332
  • 正文 我和宋清朗相戀三年标锄,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片茁计。...
    茶點故事閱讀 39,688評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡料皇,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出星压,到底是詐尸還是另有隱情践剂,我是刑警寧澤,帶...
    沈念sama閱讀 35,409評論 5 343
  • 正文 年R本政府宣布娜膘,位于F島的核電站逊脯,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏竣贪。R本人自食惡果不足惜军洼,卻給世界環(huán)境...
    茶點故事閱讀 41,001評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望演怎。 院中可真熱鬧歉眷,春花似錦、人聲如沸颤枪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,657評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至扇住,卻和暖如春春缕,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背艘蹋。 一陣腳步聲響...
    開封第一講書人閱讀 32,811評論 1 268
  • 我被黑心中介騙來泰國打工锄贼, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人女阀。 一個月前我還...
    沈念sama閱讀 47,685評論 2 368
  • 正文 我出身青樓宅荤,卻偏偏與公主長得像,于是被迫代替她去往敵國和親浸策。 傳聞我的和親對象是個殘疾皇子冯键,可洞房花燭夜當晚...
    茶點故事閱讀 44,573評論 2 353