簡體   English   中英

在“一對多”中,在更新父表時,將休眠數據插入子表中

[英]In “One to Many” Mapping hibernate data is getting inserted in child table while updating parent table

                import java.util.Set;
                import javax.persistence.CascadeType;
                import javax.persistence.Column;
                import javax.persistence.Entity;
                import javax.persistence.FetchType;
                import javax.persistence.Id;
                import javax.persistence.OneToMany;
                import javax.persistence.Table;

                @Entity
                @Table(name="BILLING_INFORMATION")
                public class BillingInformation {

                    @Id
                    @Column(name="BILL_NO", unique = true, nullable = false, length = 100)
                    private String bNo;

                    @Column(name="BILL_DATE", length = 100)
                    private String billDate;

                    @Column(name="PARTY_NAME", length = 100)
                    private String partyName;

                    @Column(name="SUB_TOTAL", length = 100)
                    private String subTotal;

                    @Column(name="TOTAL", length = 100)
                    private String total;

                    @OneToMany(fetch=FetchType.EAGER, mappedBy="billInformation", cascade = CascadeType.ALL,orphanRemoval=true)
                    Set<BillingItemInformation> setBillingItemInformation;

                    @OneToMany(fetch=FetchType.EAGER, mappedBy="billInformation", cascade = CascadeType.ALL,orphanRemoval=true)
                    Set<BillingTaxInformation> setBillingTaxInformation;

            ----all getters and setters----
            }


        import javax.persistence.Column;
        import javax.persistence.Entity;
        import javax.persistence.GeneratedValue;
        import javax.persistence.GenerationType;
        import javax.persistence.Id;
        import javax.persistence.JoinColumn;
        import javax.persistence.ManyToOne;
        import javax.persistence.Table;

        @Entity
        @Table(name="BILLING_ITEM_INFORMATION")
        public class BillingItemInformation {


            @Id
            @GeneratedValue(strategy=GenerationType.IDENTITY)
            @Column(name = "RECORD_ID", unique = true, nullable = false, length = 100)
            private int recordNo;

            @Column(name = "S_NO", length = 100)
            private String sNo;

            @Column(name="ITEM", length = 100)
            private String item;

            @Column(name="QTY", length = 100)
            private String qty;

            @Column(name="PRICE", length = 100)
            private String price;

            @Column(name="AMOUNT", length = 100)
            private String amount;

            @ManyToOne
            @JoinColumn(name="BILL_NO", nullable=false)
            private BillingInformation billInformation;

        ---all getters and setters----

    }

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;

@Entity
@Table(name="BILLING_TAX_INFORMATION")
public class BillingTaxInformation {

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name = "RECORD_ID", unique = true, nullable = false, length = 100)
    private int recordNo;

    @Column(name = "TAX_NAME", length = 100)
    private String taxName;

    @Column(name = "TAX_PERCENTAGE", length = 100)
    private String taxInPercent;

    @Column(name = "TAX_AMOUNT", length = 100)
    private String taxAmount;

    @ManyToOne
    @JoinColumn(name="BILL_NO", nullable=false)
    BillingInformation billInformation;
--------all getters and setters----
}

我剛剛開始從簡單的Java jdbc學習休眠,作為我們項目要求的一部分,我必須維護上述三個類,但是當我更新BillingInformation.java實體類對象時,BillingTaxInformation.java和BillingItemInformation.java類對象將插入相同的對象。不同的記錄號 請糾正我在哪里做錯了。

您在集合的兩個@OneToMany映射中都使用了層疊= CascadeType.ALL。

這意味着對BillingInformation實體執行的任何操作都將傳播到子BillingItemInformation和BillingTaxInformation。

那就是你

  • 堅持
  • 刷新
  • 合並
  • 去掉
  • 分離

..同樣適用於這些孩子。

如果您只想在父實體為

  • 永久(或保存為休眠語言)
  • 和DELETED(@OneToMany的兩個最常見的選項)

,但是在MERGE和后續更新期間,您不想將這些操作級聯到子級,然后按以下方式設置映射:

@OneToMany(fetch=FetchType.EAGER, mappedBy="billInformation"
          , cascade = { CascadeType.PERSIST, CascadeType.REMOVE }
          ,orphanRemoval=true)
Set<BillingItemInformation> setBillingItemInformation;

@OneToMany(fetch=FetchType.EAGER, mappedBy="billInformation"
         , cascade ={ CascadeType.PERSIST, CascadeType.REMOVE }
         ,orphanRemoval=true)
Set<BillingTaxInformation> setBillingTaxInformation;

更新

使用休眠注釋,您可以配置如下:

@Cascade({CascadeType.PERSIST, CascadeType.DELETE})

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM