[英]JPA Foreign Key is Null
我正在开发一个Web应用程序,并且正在使用JSF和JPA(EclipseLink)。 我有表story
和story_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
不能为null。
我以前管理过关系,但从未见过此错误。
问题出在哪里?
编辑:对不起,但我已经忘记了映射的另一部分(必须是缺乏睡眠)。
问题是,您在StoryTranslate
类中为STORY_ID
列声明了storyId
属性,但是在添加新的StoryTranslate
,您未将任何值设置为其storyId
属性,并且我相信STORY_ID
列具有NOT NULL约束,这就是为什么说story_id不能为null的异常。
一旦在提交事务之前设置了StoryTranslate
实例的storyId
属性,就应该解决该问题。
但令人奇怪的是,你在地图STORY_ID
列到两个不同的特性( storyId
和story
中的) StoryTranslate
类。 实际上,您无需声明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
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.