【问题标题】:Hibernate - Populate sub entity on insertHibernate - 在插入时填充子实体
【发布时间】:2016-11-30 16:55:29
【问题描述】:

我添加了 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
    }

重点是用ActivityMO.id 值填充ActivitiesProductsMO.activityId 的每个数据库记录

即 如果我创建一个 id = 555 的活动记录 我将获得另一个 activity_product 记录,activityId 为 555

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

【问题讨论】:

  • 请澄清:如果您插入一个新的 ActivityMO,您是要更改所有现有的 ActivitiesProductsMO 以指向该 ActivityMO(通过其 activityId 映射字段),还是要在离开时创建一个新的 ActivitiesProductsMO所有其他人都没有动过?我想它是第二个......但我的问题是:为什么是一个?您使用 OneToMany 定义了您的实体,这意味着对于每个 ActivityMO 可以有多个链接的 ActivityProductsMO。
  • 嗨。它不完全是一个,它只是一个例子。如果 activityMO 带有 20 个 activityProductMOs 列表,则需要创建 20 个新的 ACTIVITY_PRODUCT 记录,并且所有这些记录都需要具有 activityId = activityMO.id

标签: java database oracle hibernate


【解决方案1】:

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

将 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,该 ActivityMO 已经在其相关产品列表中包含了 ActivitiesProductsMO 条目,Cascade 类型实际上应该小心并创建这些产品,同时使用正确的值填写 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;


}

并删除

private Long activityId;

来自您的 ActivitiesProductsMO 类。

这都应该导致相同的数据库结构。但在第二种情况下,您将不再有 java 内从 ActivitiesProductsMOActivityMO

的“反向链接”

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-30
    • 2013-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-16
    • 1970-01-01
    相关资源
    最近更新 更多