【问题标题】:JPA: implicity persist @ManyToOne entitiesJPA:隐式持久化@ManyToOne 实体
【发布时间】:2013-07-16 18:11:20
【问题描述】:

我的表结构与以下类似:

Table_A(
  a_id,
  data,
  primary key(a_id)
)

Table_B(
  b_id,
  a_id,
  data,
  primary key (b_id),
  foreign key (a_id) references Table_A(a_id)
)

Table_A 和 Table_B 之间存在一对多的关系。我的问题是,如果我对这些表中的每一个都有一个实体,其中:

  • Entity Table_A 由 Table_B 实体列表和
  • 实体 Table_B 不一定需要引用 Table_A(只需字段 b_id、a_id、数据)

是否有可能以一种我可以持久化 Table_A 实体的方式注释这些实体,并且该过程将使用新生成的 Table_A 主键 a_id 的值隐式持久化所有 Table_B 实体。

提前致谢。

这就是我所拥有的。但我得到以下异常。看起来 Table_B 在 Table_A 之前被持久化,因此不存在 a_id 值。

@Entity
public class Table_A {
   @Id
   @GeneratedValue(strategy = GenerationType.IDENTITY)
   @Column(name = "a_id")
   private Integer id;

   @OneToMany (cascade = CascadeType.PERSIST)
   @JoinColumn(name="a_id")
   private List<Table_B> bList;

   private String data;
}

@Entity
public class Table_B {
   @Id
   @GeneratedValue(strategy = GenerationType.IDENTITY)
   @Column(name = "b_id")
   private Integer id;

   private String data;
}

错误:“a_id”列中的空值违反非空约束 详细信息:失败行包含 (null, Testing, 16)

【问题讨论】:

    标签: jpa persist


    【解决方案1】:

    是的,在 OneToMany 关联上将级联设置为 PERSIST

    请注意,B 实体中不应有 aId。要么使关联是双向的,并且有一个 TableA 类型的字段,要么让它保持单向,并且 B 中没有任何字段映射到 a_id。

    编辑:AFAIR,您需要告诉 Hibernate 该列不为空,否则它会尝试先插入所有内容,然后填充外键:

    @OneToMany (cascade = CascadeType.PERSIST)
    @JoinColumn(name="a_id", nullable=false)
    private List<Table_B> bList;
    

    【讨论】:

    • 感谢您的及时回复。我尝试如下,但在插入 Table_B.a_id 上的非空约束时出现异常。也许,我没有正确遵循您的解决方案。
    • 那么,与其问它是否有可能,不如展示你的代码,展示异常的痕迹,并问它为什么会抛出这个异常?这样可以避免像我给你的那样无用的答案。
    【解决方案2】:
    @OneToMany(mappedBy = "a_id", cascade = CascadeType.PERSIST)
    

    而不是

    @OneToMany(cascade = CascadeType.PERSIST) @JoinColumn(name="a_id")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-22
      • 1970-01-01
      • 1970-01-01
      • 2011-07-16
      • 2013-08-08
      • 2021-05-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多