2016-11-30 101 views
1

伊夫加入2-休眠模型子實體對象 第一個表休眠 - 填充在插入

 @Entity 
     @Table(name = "ACTIVITIES") 
    public class ActivityMO extends ModelBase { 

     @Column(name = "CA_ID", nullable = false, insertable = true,updatable = true, length = 22, precision = 0) 
     @Id 
     @GeneratedValue(strategy = GenerationType.AUTO, generator = "G1") 
     @SequenceGenerator(name = "G1", sequenceName = "CSM_ACTIVITIES_SEQ") 
     private Long id; 

     @OneToMany(fetch = FetchType.LAZY, mappedBy = "activityId", cascade = {CascadeType.ALL}) 
     @Fetch(FetchMode.JOIN) 
     List<ActivitiesProductsMO> relatedProducts; 

    ...getters/setters 
     } 

另一表是

@Entity 
@Table(name = "ACTIVITIES_PRODUCTS") 
public class ActivitiesProductsMO { 

@Column(name = "CAP_ID") 
@Id 
@GeneratedValue(strategy = GenerationType.AUTO, generator = "G1") 
@SequenceGenerator(name = "G1", sequenceName = "ACTIVITIES_PRODUCTS_SEQ") 
private Long id; 
    @Column(name = "CAP_ACTIVITY_ID") 
    private Long activityId; 

@Column(name = "CAP_PRODUCT_ID") 
private Long productId; 

...getters/setters 
    } 

的點是填充爲ActivitiesProductsMO.activityId每分貝記錄與ActivityMO.id值

iee 如果我創建一個活動記錄ID = 555 我會得到activityId爲555的另一個activity_product記錄

我該如何得到這個工作? 謝謝!

+0

請澄清:如果你插入一個新的ActivityMO,你想改變現有的所有ActivitiesProductsMO以指向ActivityMO (通過它的activityId映射字段),還是你想創建一個新的ActivitiesProductsMO,同時保持所有其他的不變?我想它是第二次......但是接下來我的問題是:爲什麼會是一個?您使用OneToMany定義實體,這意味着對於每個ActivityMO,都可以有多個鏈接的ActivityProductsMO。 –

+0

嗨。它不完全是一個,它只是一個例子。如果activityMO帶有20個activityProductMOs列表,則需要創建20個新的ACTIVITY_PRODUCT記錄,並且所有這些記錄都需要具有activityId = activityMO.id –

回答

0

不用手動嘗試與長值entitiy關係,則應該使用ActivityMO雙向一對多關係ActivitiesProductsMO

變化ActivitiesProductsMO映射:

@Entity 
@Table(name = "ACTIVITIES_PRODUCTS") 
public class ActivitiesProductsMO { 

    // cut unimportant code ... 

    @ManyToOne 
    @JoinColumn(name = "CAP_ACTIVITY_ID") 
    private ActivityMO activityId; 

    // cut unimportant code ... 

} 

然後,如果您是堅持的ActivityMO在其RelatedProducts列表中已經有ActivitiesProductsMO條目,Cascade類型實際上應該小心並創建這些產品,同時使用正確的值填充CAP_ACTIVITY_ID數據庫字段。

另一個可能的解決方案:

使用單向一對多:

@Entity 
@Table(name = "ACTIVITIES") 
public class ActivityMO extends ModelBase { 

    @OneToMany(fetch = FetchType.LAZY, cascade = {CascadeType.ALL}) 
    @Fetch(FetchMode.JOIN) 
    @JoinColumn(name = "CAP_ACTIVITY_ID") 
    List<ActivitiesProductsMO> relatedProducts; 


} 

,並清除

private Long activityId; 
從ActivitiesProductsMO類

這應該導致相同的數據庫結構。但是在第二種情況下,你將不再有Java裏面的「反向」從ActivitiesProductsMOActivityMO