Arhn - архитектура программирования

JPA 2: нарушение ограничения ссылочной целостности при сохранении объекта с ненаправленным отношением OneToMany

Я работаю над дизайном базы данных и реализацией на Java модели некоторых спортивных событий. У меня есть две сущности: Game и Participant и ненаправленная связь OneToMany между ними. Game может иметь много Participant.

В базе это выглядит так:

введите здесь описание изображенияКонечно, у меня есть ограничение FK для таблицы event_participant:

CONSTRAINT `FK_par_eve_eve_id__eve_id`
    FOREIGN KEY (`event_id`)
    REFERENCES `event` (`id`));

В коде Java я написал это сопоставление (упрощенное):

@Entity
@Table(name = "event")
public class GameEntity extends AbstractPersistable<Long> implements Game {
    @Nullable
    @OneToMany(cascade = CascadeType.PERSIST, mappedBy = "game")
    private List<ParticipantEntity> participants;
}

@Entity
@Table(name = "event_participant")
public class ParticipantEntity extends AbstractPersistable<Long> implements GameParticipant {
    @ManyToOne
    @JoinColumn(name="event_id", referencedColumnName = "id", insertable = true)
    private GameEntity game;
}

Тест:

TeamEntity teamHome = teamsDao.findOne(1L);
TeamEntity teamGuest = teamsDao.findOne(2L);
GameEntity newEntity = new GameEntity()
        .addParticipant(teamHome, GameParticipant.Alignment.HOME)
        .addParticipant(teamGuest, GameParticipant.Alignment.GUEST);

dao.save(newEntity);

public GameEntity addParticipant(TeamEntity team, GameParticipant.Alignment alignment) {
    if (participants == null) {
        participants = new ArrayList<ParticipantEntity>();
    }
    participants.add(ParticipantEntity.create(team, alignment));
    return this;
}

public static ParticipantEntity create(TeamEntity team, Alignment alignment) {
    ParticipantEntity object = new ParticipantEntity();
    object.team = team;
    object.alignment = alignment;
    return object;
}

Когда я пытаюсь сохранить новый объект GameEntity, который содержит только что созданные объекты Participant, я ожидаю, что Hibernate создаст одну новую запись в таблице event и связанные записи в таблице event_participant.

Но у меня есть исключение:

Referential integrity constraint violation: "FK_PAR_EVE_EVE_ID__EVE_ID: PUBLIC.EVENT_PARTICIPANT FOREIGN KEY(EVENT_ID) REFERENCES PUBLIC.EVENT(ID) (0)"; SQL statement:
insert into event_participant (id, alignment, event_id, participant_id, participant_type) values (null, ?, ?, ?, ?)

Этот запрос на вставку содержит значение NULL для поля event_id. Я не понимаю, почему. Когда я удалил ограничение БД, все в порядке, и столбец event_id имеет правильное значение.

Все шаблоны выполняются с помощью классов Spring Data util. Я использую JPA 2.0, mysql-connector-java 5.1.28, hibernate-entitymanager 4.0.1.Final, spring-data-jpa 1.3.4.RELEASE и базу данных H2 для тестирования. Я получил тот же результат, используя H2 или MySQL.

Где я потерпел неудачу?


  • Как выглядит addParticipant? Содержит ли метод participants.add(...) и participantEntity.setGame(this)? 20.01.2014
  • Я обновил исходный пост. 20.01.2014

Ответы:


1

Вы не установили другую сторону этой двунаправленной ассоциации:

public GameEntity addParticipant(TeamEntity team, GameParticipant.Alignment alignment) { 
    ParticipantEntity pe = ParticipantEntity.create(team, alignment)
    participants.add(pe);
    pe.setGame(this);
    return this; 
} 

Следует отметить, что вы не установили поле внешнего ключа для участника, как в pe.setGame(this)

20.01.2014
  • О, позор мне. Спасибо, @orid. Есть ли способы не делать это вручную? 20.01.2014
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..