Java Hibernate-在插入时填充子实体

Java Hibernate-在插入时填充子实体,java,database,oracle,hibernate,Java,Database,Oracle,Hibernate,Ive添加了2个hibernate模型对象 第一桌 @Entity @Table(name = "ACTIVITIES") public class ActivityMO extends ModelBase { @Column(name = "CA_ID", nullable = false, insertable = true,updatable = true, length = 22, precision = 0) @Id

Ive添加了2个hibernate模型对象 第一桌

      @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
        }
重点是用ActivityMO.id值填充ActivityProductsMo.activityId的每个db记录

即。 如果我创建id为555的活动记录 我将获得另一个activityId为555的activity\u产品记录

我怎样才能让它工作?
谢谢大家!

不应手动尝试使用长值映射实体关系,而应使用从ActivityMO到ActivitiesProductsMO的双向OneDomain关系

将活动ProductsMo更改为:

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

    // cut unimportant code ...

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

    // cut unimportant code ...

}
如果要持久化在其relatedProducts列表中已经有ActivityProductsMo条目的ActivityMO,则级联类型实际上应该注意并创建这些产品,同时使用正确的值填充CAP_ACTIVITY_ID数据库字段

另一种可能的解决方案:

使用单向OneToMany:

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


}
来自您的活动ProductsMo课程


这将导致相同的数据库结构。但是在第二种情况下,您将不再具有java内部从Activities ProductsMo到Activities ProductsMo的“反向链接”,而不是手动尝试用长值映射实体关系,您应该使用从Activities ProductsMo到Activities ProductsMo的双向一对一关系

将活动ProductsMo更改为:

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

    // cut unimportant code ...

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

    // cut unimportant code ...

}
如果要持久化在其relatedProducts列表中已经有ActivityProductsMo条目的ActivityMO,则级联类型实际上应该注意并创建这些产品,同时使用正确的值填充CAP_ACTIVITY_ID数据库字段

另一种可能的解决方案:

使用单向OneToMany:

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


}
来自您的活动ProductsMo课程


这将导致相同的数据库结构。但在第二种情况下,您将不再具有java内部从ActivityProductsMo到ActivityMO的“反向链接”

请澄清:如果插入新ActivityMO,是否要更改所有现有ActivityProductsMo以指向该ActivityMO(通过其activityId映射字段),或者您想创建一个新的Activities ProductsMo,同时保留所有其他内容?我想这是第二次。。。但我的问题是:为什么只有一个?您使用OneToMany定义了实体,这意味着对于每个ActivityMO,都可以有多个链接的ActivityProductsMO.Hi。这不完全是一个例子,它只是一个例子。如果activityMO附带了20个ActivityProductMo列表,则需要创建20个新的ACTIVITY_产品记录,并且所有这些记录都需要activityId=activityMO.idPlease澄清:如果插入新activityMO,是否要将所有现有ActivityProductsMo更改为指向该activityMO(通过其activityId映射字段),或者您想创建一个新的Activities ProductsMo,同时保留所有其他内容?我想这是第二次。。。但我的问题是:为什么只有一个?您使用OneToMany定义了实体,这意味着对于每个ActivityMO,都可以有多个链接的ActivityProductsMO.Hi。这不完全是一个例子,它只是一个例子。如果activityMO附带20个activityProductMOs列表,则需要创建20个新的ACTIVITY_产品记录,并且所有记录都需要activityId=activityMO.id