2012-03-28 9 views
2

Ich arbeite an einer Web-App und ich verwende JSF und JPA (EclipseLink). Ich habe die Tabellen story und story_translate, die abgebildet werden, wie folgt:JPA Foreign Key ist Null

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

In einem ManagedBean ich folgendes tue:

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(); 

Wenn ich versuche, einen neuen StoryTranslate zu schaffen, habe ich eine DatabaseException bekommen , sagt die story_id kann nicht null sein.

Ich habe Beziehungen zuvor verwaltet, aber ich habe diesen Fehler nie gesehen.

Wo ist das Problem?

EDIT: Es tut mir leid, aber ich habe vergessen, über einen anderen Teil der Zuordnung (muss der Mangel an Schlaf sein).

Antwort

2

Das Problem ist, dass Ihr declare die storyId Eigenschaft in der StoryTranslate Klasse für die STORY_ID Spalte, aber wenn eine neue StoryTranslate Hinzufügen Sie keinen Wert auf seine storyId Eigenschaft festgelegt und ich glaube, STORY_ID Spalte eine NOT NULL Bedingung hat und dass Warum erhalten Sie die Ausnahme, dass story_id nicht null sein kann?

Das Problem sollte behoben werden, sobald Sie die storyId-Eigenschaft der StoryTranslate-Instanz vor der Übergabe der Transaktion festlegen.

Aber es ist seltsam, dass Sie die STORY_ID Spalte auf zwei verschiedene Eigenschaften zuordnen (storyId und story) der StoryTranslate Klasse. Tatsächlich müssen Sie die Eigenschaft storyId nicht deklarieren, da dieser Wert aus der story Instanz abgerufen werden kann. Ich schlage vor, dass Sie das Mapping von StoryTranslate in das folgende ändern, und Ihr Code sollte gut ohne Änderungen funktionieren.

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