我使用JPA2與EclipseLink的實施@ManyToOne映射無法保存父ID
![簡單的表結構] [1]
這裏有兩個表,我試圖映射和JPA註釋。
public class Story implements Serializable{
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
Integer id;
@Temporal(TemporalType.TIMESTAMP)
@Column (name="DATE_CREATED")
Date dateCreated;
String title;
String description;
@Column(name="AUTHOR_ID")
Integer authorId;
@Column(name="COUNTRY_ID")
Integer countryId;
private String reviews;
@OneToMany(mappedBy = "story", cascade=CascadeType.ALL)
private List<Tip> tipList;
}
public class Tip implements Serializable{
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
private Integer id;
private String description;
private Integer vote;
@ManyToOne (cascade=CascadeType.ALL)
@JoinColumn(name="STORY_ID", referencedColumnName="ID")
private Story story;
}
作爲一個簡單的例子,我想在同一個事務中堅持一個故事和一些故事相關的技巧。 這裏的代碼確實是,部分:
Story newStory = new Story(title, body, ...);
EntityTransaction transaction = em.getTransaction().begin();
boolean completed = storyService.create(newStory);
//The tips are saved as a List<String>. This methods creates the needed List<Tip> from the Strings
List<Tip> tips = TipUtil.getTipList(tipList);
newStory.setTipList(tips)
transaction.commit();
我沒有錯誤,所有的實體在數據庫中堅持着。問題是在小費表story_id
字段總是NULL
。我可以想象,JPA無法從故事表中獲得新的id
。這裏的正確方法是什麼?
LE
在代碼的當前狀態,該Tip
實體仍然存在,但該國ID仍無效。
我想知道是否沒有更自動的方式來做到這一點。更重要的是,我真的不認爲刪除提示中的故事字段是一個聰明的想法,因爲這樣,他將需要擺脫'@PrimaryKeyJoinColumn(name =「STORY_ID」,referencedColumnName =「ID」 )',讓JPA不知道應該如何進行加入。這正是我通過閱讀這個主題所瞭解的。如果我錯了,請讓我知道。 – Dragos 2012-02-28 11:50:26
Ebean有自動解決方案,但JPA實現不提供自動解決方案。 – Palesz 2012-03-08 15:10:14