我有类似的表格结构如下:
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_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)
答案 0 :(得分:1)
是的,在OneToMany协会上将级联设置为PERSIST
。
请注意,B实体中不应包含aId。要么使关联成为双向关系,要么具有TableA类型的字段,要么保持单向,并且B中没有任何字段映射到a_id。
编辑:AFAIR,您需要告诉Hibernate该列不为null,否则它会先尝试插入所有内容,然后填充外键:
@OneToMany (cascade = CascadeType.PERSIST)
@JoinColumn(name="a_id", nullable=false)
private List<Table_B> bList;
答案 1 :(得分:0)
@OneToMany(mappedBy = "a_id", cascade = CascadeType.PERSIST)
而不是
@OneToMany(cascade = CascadeType.PERSIST) @JoinColumn(name="a_id")