Я работаю над дизайном базы данных и реализацией на 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.
Где я потерпел неудачу?