Hibernate:更新OneToMany关系

时间:2012-06-05 11:58:05

标签: java hibernate

我的父母有一个子映射列表。

我可以知道在更新父

时如何更新子列表

示例:

父母P1有孩子A B C.

我决定删除B并添加D

所以父P1在数据库中有子A C D.

目前我只是删除属于父P1的所有孩子并再次重新填充chid(A C D)......我相信有一种更简单的方法。

我知道这项任务非常敏感,请善意告诉我需要设置的内容,以确保正确插入和删除子项。

新问题:

1)有没有办法懒惰更新/删除关系?我有一个FetchType.Lazy列表,当我更新数据时,我可能不希望加载关系或更新它。

2)如果列表中有项目A B C,我删除了项目C并执行了dto.save()。项目C会被删除吗?

2 个答案:

答案 0 :(得分:2)

以下是使用父级更新子级的映射 -

@Entity
@Table(name = "COMPANY")
@SequenceGenerator(name="CompanySeq", sequenceName="COMPANYseq", allocationSize=1)
public class Company implements Serializable {

    private static final long serialVersionUID = 1L;

    /*
     * Customer Company Details 
     */

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "CompanySeq")
    @Column(name = "COMPANY_ID")
    private Integer id;

    @Column(name="COMPANY_NAME")
    private String name;

    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    @JoinColumn(name = "COMPANY_ID",nullable=false)
    @OrderBy(clause = "PRODUCT_NAME" )
    @ForeignKey(name = "fk_company_product")     
    private List<Product> products = new ArrayList<Product>();    

 }



 @Entity
@Table(name = "PRODUCT")
@SequenceGenerator(name="CompanyProductSeq", sequenceName="COMPANY_PRODUCT",  allocationSize=1)
public class Product implements Serializable{

    /**
     * SerialVersion ID
     */
    private static final long serialVersionUID = 4073418246832063389L;

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "CompanyProductSeq")
    @Column(name = "PRODUCT_ID")
    private Integer id;

    @ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(name = "COMPANY_ID", updatable = false, insertable = false, nullable=false)  
    private Company companyId;

        @Column(name = "PRODUCT_NAME")
    private String name;

    }

答案 1 :(得分:2)

Promod的1+,因为他提供了非常好的代码来理解它。您想要的功能全部是Hibernate Cascade。通过使用级联,您只需要更新父bean对象及其子对象列表,Cascade将完成剩下的工作。

@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JoinColumn(name = "COMPANY_ID",nullable=false)
@OrderBy(clause = "PRODUCT_NAME" )
@ForeignKey(name = "fk_company_product")     
private List<Product> products = new ArrayList<Product>();    

在Pramod给出的上层示例中,公司保留了有关产品的所有数据,因为它是孩子。在这里

@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)

cascadeType.All也将对子进行所有父母操作,即公司的插入/更新将在产品上执行相同的操作,如果您想更新公司的产品,您只需要使用产品获取已加载的公司bean(< em> FetchType.EAGER ),在bean中修改或添加新产品并saveUpdate公司。它也将保存/更新公司及其产品。