0

我有与以下类似的表结构:

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 之间存在一对多的关系。我的问题是,如果我对这些表中的每一个都有一个实体,其中:

  • 实体 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”列中的空值违反非空约束详细信息:失败行包含(空,测试,16)

4

2 回答 2

1

是的,PERSIST在 OneToMany 关联上设置了级联。

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

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

@OneToMany (cascade = CascadeType.PERSIST)
@JoinColumn(name="a_id", nullable=false)
private List<Table_B> bList;
于 2013-07-16T18:15:32.250 回答
0
@OneToMany(mappedBy = "a_id", cascade = CascadeType.PERSIST)

代替

@OneToMany(cascade = CascadeType.PERSIST) @JoinColumn(name="a_id")
于 2014-12-02T11:26:50.560 回答