Java 在“一对多”映射中,hibernate在更新父表时将数据插入子表中

Java 在“一对多”映射中,hibernate在更新父表时将数据插入子表中,java,sql,hibernate,Java,Sql,Hibernate,我刚开始从简单的java jdbc学习hibernate,作为我们项目需求的一部分,我必须维护以上三个类,但当我更新BillingInformation.java实体类对象时,BillingTaxInformation.java和BillingItemInformation.java类对象会插入具有不同记录号的相同对象。请纠正我的错误。您使用的是cascade=CascadeType.ALL,在集合的@OneToMany映射中 这意味着对BillingInformation实体执行的任何操作也将

我刚开始从简单的java jdbc学习hibernate,作为我们项目需求的一部分,我必须维护以上三个类,但当我更新BillingInformation.java实体类对象时,BillingTaxInformation.java和BillingItemInformation.java类对象会插入具有不同记录号的相同对象。请纠正我的错误。

您使用的是cascade=CascadeType.ALL,在集合的@OneToMany映射中

这意味着对BillingInformation实体执行的任何操作也将传播到子BillingItemInformation和BillingTaxInformation

那就是你

坚持 刷新 合并 去除 拆卸 。。这同样适用于这些儿童

如果只希望在父实体为

以hibernate语言保存的PERSISTEDor 并删除了@OneToMany最常见的两个选项 ,但在合并和后续更新期间,您不希望将这些操作级联到子级,然后按如下方式设置映射:

                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----
}
@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;

发布所有实体的hashcode&equals方法。这可能是因为Id字段首次加载到集合中时可能为空。更新BillingInformation实例的代码在哪里?映射似乎没有问题。您的意思是可能是级联类型。删除?正确。。对于JPA,它应该被删除。。删除处于休眠状态annotation@Maciej我还想在更新父记录时更新子记录,但它应该更新现有记录,而不是为billingtaxinformation或billingiteminformation创建新记录编号。子实体的记录是否带有ID?那些ID已经在数据库中了吗?如何更新我想看到的代码这个答案似乎与OP的问题完全无关。
@Cascade({CascadeType.PERSIST, CascadeType.DELETE})