JPA 外键为空

4

我正在开发一个Web应用程序,使用JSF和JPA(EclipseLink)。我有表storystory_translate,它们的映射如下:

@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 不能为空。
我之前处理过关联,但从未见过这个错误。
问题出在哪里?
编辑:对不起,我忘记了映射的另一部分(可能是因为睡眠不足)。
1个回答

4
问题在于您在 StoryTranslate 类中为 STORY_ID 列声明了 storyId 属性,但是当添加新的 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
}

如果我的父类Story表名设置为@Table("my_story"),我该如何映射@JoinColumn?这里的命名规范是什么? - dryleaf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接