2012-06-05 227 views
1

我有一个家长与子映射的列表。休眠:更新OneToMany关系

可我知道怎么做,当我更新父

例子我更新孩子的名单:

父P1有孩子AB C.

我决定删除B和添加d

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

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

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

新问题:

1)是否有办法偷懒更新/删除的关系?我有一个名为FetchType.Lazy的列表,当我更新数据时,我可能不希望加载关系或更新它。 2)如果列表中有项目A B C,我删除项目C并执行dto.save()。项目C会被删除吗?

+0

你想要做什么?从父级删除子实体,还是删除它们?这不是一回事。并告诉我们你的代码,以了解你在做什么。 –

+0

您是否在使用列表或地图将孩子与父母联系起来? – Logan

+0

我正在使用List,但遗憾的是我无法在此处生成代码,因为它是禁止的。即使这个问题也被改写了。 – seesee

回答

1

下面是一个使用家长更新孩子的映射 - 为他提供了很好的代码来了解它的百路达

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

    } 
+0

那么您如何实际更新数据库中的产品列表 – seesee

+0

我将在公司对象中添加产品列表,并将公司对象保存为db。它会自动将公司对象中的所有产品插入产品表中。 –

1

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

+0

我的关系在FatchType.Lazy上。当我更新时,我可能不想更新特定的关系。有没有办法“懒”更新/删除? – seesee

+0

我也想问一下List是否有3次(A,B,C),我从列表中删除1项(A)。将级联函数自动删除 – seesee