JPA Внешний ключ является нулевым - PullRequest
3 голосов
/ 28 марта 2012

Я работаю над веб-приложением и использую 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 не может быть нулевым.

Раньше у меня были отношения, но я никогда не видел эту ошибку.

Где проблема?

РЕДАКТИРОВАТЬ: Извините, но я забыл о другой части отображения (должно быть, недостаток сна).

1 Ответ

3 голосов
/ 28 марта 2012

Проблема в том, что вы объявляете свойство storyId в классе StoryTranslate для столбца STORY_ID, но при добавлении нового StoryTranslate вы не устанавливаете никакого значения для его свойства storyId, и я считаю STORY_ID столбец имеет ограничение NOT NULL, и поэтому вы получаете исключение, говорящее, что story_id не может быть нулевым.

Проблема должна быть решена после установки свойства storyId экземпляра StoryTranslate перед совершением транзакции.

Но странно, что вы сопоставляете столбец 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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...