2012-03-28 171 views
2

我正在開發一個Web應用程序,我正在使用JSF和JPA(EclipseLink)。我有表storystory_translate,其分別對應如下:JPA外鍵爲空

@Entity 
@Table(name = "story") 
public class Story{ 
@Id 
@GeneratedValue(strategy = GenerationType.SEQUENCE) 
private Integer id; 
private String title; 
private String description; 
@OneToMany(mappedBy = "story", cascade=CascadeType.ALL) 
private List<StoryTranslate> translateList; 

    //getters and setters 
} 

@Entity 
@Table(name = "story_translate") 
public class StoryTranslate{ 
@Id 
@GeneratedValue(strategy = GenerationType.SEQUENCE) 
private Integer id; 
@Column(name="STORY_ID") 
private Integer storyId; 
    @ManyToOne 
@JoinColumn(name="story_id", referencedColumnName="id", updatable=false, insertable=false) 
private Story story; 

    //some other fields, getters and setters 
} 

ManagedBean我做了以下內容:

StoryTranslate translate = new StoryTranslate(null, sessionController.getEntity().getId(), getAuthUser().getId(), language, 
        title, description, new Date(), false); 
EntityTransaction transaction = TransactionSingleton.getActiveInstance(); 
      Story story = storyService.read(sessionController.getEntity().getId()); 
      if (story != null){ 
       if (story.getTranslateList() == null){ 
        story.setTranslateList(new ArrayList<StoryTranslate>()); 
       } 
       story.getTranslateList().add(translate); 
       translate.setStory(story); 
      } 
      transaction.commit(); 

當我嘗試創建一個新的StoryTranslate,我得到一個DatabaseException ,說story_id不能爲空。

我曾經管理關係,但我從未見過這個錯誤。

問題在哪裏?

編輯:我很抱歉,但我忘記了映射的另一部分(必須是缺乏睡眠)。

回答

2

的問題是,你的聲明storyId財產在StoryTranslate類爲STORY_ID列,但增加了新的StoryTranslate的時候,你不要任何值設置爲它storyId財產,我相信STORY_ID列有一個NOT NULL約束和爲什麼你會得到異常,說story_id不能爲空。

在提交事務之前,如果您設置了StoryTranslate實例的storyId屬性,則應該解決該問題。

但奇怪的是,您將STORY_ID列映射到StoryTranslate類的兩個不同屬性(storyIdstory)。實際上,您不需要聲明storyId屬性,因爲可以從story實例中檢索此值。我建議你將StoryTranslate的映射更改爲以下代碼,並且你的代碼應該沒有任何改變就能正常工作。

@Entity 
@Table(name = "story_translate") 
public class StoryTranslate{ 
    @Id 
    @GeneratedValue(strategy = GenerationType.SEQUENCE) 
    private Integer id; 

    @ManyToOne 
    @JoinColumn(name="story_id") 
    private Story story; 

    //some other fields, getters and setters 
}