2

我有一个父级映射了一个子级列表。

我可以知道在更新父级时如何更新子级列表吗

例子:

父母 P1 有孩子 AB C。

我决定删除 B 并添加 D

所以父 P1 在数据库中有子 ACD。

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

我知道这个任务非常敏感,请让我知道我需要设置什么以确保正确插入和删除孩子。

新问题:

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

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

4

2 回答 2

3

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

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

    }
于 2012-06-05T12:13:29.603 回答
2

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

@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 也会对子节点执行所有父操作,即公司上的插入/更新将对产品执行相同的操作,如果要更新公司的产品,您只需使用产品(FetchType.EAGER)获取加载的公司 bean , 在 bean 中修改或添加新产品并保存更新公司。它也会保存/更新公司及其产品。

于 2012-06-05T14:29:23.513 回答