2012-03-28 66 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 
}