2016-11-30 86 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