2013-07-16 171 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")