2012-06-05 495 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