2012-03-28 3 views
2

웹 응용 프로그램에서 작업 중이며 JSF 및 JPA (EclipseLink)를 사용하고 있습니다.JPA 외래 키가 null입니다.

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를 얻을 : 다음은 A ManagedBean에서

@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 
} 

내가 뭐하는 거지 다음과 같이 나는 매핑되는 테이블 storystory_translate을 가지고 story_id은 null 일 수 없습니다.

이전에 관계를 관리했지만이 오류를 본 적이 없습니다.

어디에 문제가 있습니까?

편집 : 죄송하지만 매핑의 다른 부분을 잊어 버렸습니다 (수면 부족이어야 함).

답변

2

문제는 새로운 StoryTranslate를 추가 할 때 당신의 선언 STORY_ID 열의 StoryTranslate 클래스의 storyId 재산하지만, 당신이 storyId 속성에 값을 설정하지 않는 것이 내가 STORY_ID 열이 NULL 제약 조건을 가지고 있다고 생각 story_id가 null이 될 수 없다는 예외를 얻는 이유는 무엇입니까?

트랜잭션을 커밋하기 전에 StoryTranslate 인스턴스의 storyId 속성을 설정하면 문제가 해결됩니다.

열을 StoryTranslate 클래스의 두 가지 속성 (storyIdstory)으로 매핑하는 것은 이상합니다. 실제로이 값은 story 인스턴스에서 검색 할 수 있으므로 storyId 속성을 선언 할 필요가 없습니다. 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 
} 
관련 문제