JPA:implicity坚持@ManyToOne实体

时间:2013-07-16 18:11:21

标签: jpa persist

我有类似的表格结构如下:

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,data)

是否可以以我可以持久化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)

2 个答案:

答案 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")