2013-07-16 142 views
0

我有一个类似的表结构如下:JPA:含蓄坚持@ManyToOne实体

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

有一对表-A和表-B之间一对多的关系。我的问题是,如果我对每个表,其中的实体:

  • 实体表-A由表-B实体的名单,并
  • 实体表-B不一定需要表-A的引用(只田B_ID,A_ID,数据)

是有可能的方式来诠释这些实体在那里我能坚持一个表-A实体和进程将隐含坚持所有表-B实体与新产生的表-A的主键A_ID的价值。

在此先感谢。

这里是我基本上有。但我得到以下例外。看起来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; 
} 

ERROR: null value in column "a_id" violates not-null constraint Detail: Failing row contains (null, Testing, 16)

+0

请参阅我编辑的答案 –

回答

1

是的,设置为PERSIST在一对多关联的级联。

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

编辑:AFAIR,你需要告诉Hibernate,列不为空,否则它会尝试先插入的一切,然后填充外键:

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

感谢您的及时回复。我试图如下,但我得到一个插入的例外Table_B.a_id非空约束。也许,我没有正确地遵循你的解决方案。 – user1491636

+0

因此,不要问它是否可以这样做,为什么不显示代码,显示异常的跟踪痕迹,并询问为什么会抛出此异常?这将避免一个无用的答案,就像我给你的答案一样。 –

0
@OneToMany(mappedBy = "a_id", cascade = CascadeType.PERSIST) 

代替

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