У меня есть приложение, которое учит пользователя, как играть в различные карточные игры.Сохраняемая модель данных состоит из TrainingSession
с однонаправленным отношением один-ко-многим с Hands
.
[ EDIT ] Для пояснения, Hand
не существует вне контекста TrainingSession
(то есть они создаются / уничтожаются, когда TrainingSession
).Следуя принципам Data Driven Design, TrainingSession обрабатывается как агрегированный корень, и поэтому используются единственные пружинные данные CrudRepository
(т. Е. Репозиторий для Hand
не создается)
Когда я пытаюсьсохраняя TrainingSession с помощью CrudRepository, я получаю: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: невозможно добавить или обновить дочернюю строку: ограничение внешнего ключа не выполняется (blackjack
. hand
, CONSTRAINT FKrpuxac6b80xc7rc98vt1euc3n
FOREIGN KEY(id
) ССЫЛКИ training_session
(tsid
))
Моя проблема - операция 'save (trainingSession)' через экземпляр CrudRepository.Я не понимаю, почему в сообщении об ошибке указано, что FOREIGN KEY (id) REFERENCES training_session (tsid))
.Кажется, это является причиной проблемы, но я не могу понять, почему это так или как это исправить.Отношения являются однонаправленными, и ничто в классе Hand не относится к TrainingSession.
Код, за исключением всех методов получения и установки:
@Entity
public class TrainingSession {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer tsid;
private String strategy;
@OneToMany(cascade=CascadeType.ALL)
@JoinColumn(name="id")
private List<Hand> hands;
private int userId;
protected TrainingSession() {
}
public TrainingSession(int userId, Strategy strategy, List<Hand> hands) {
this.strategy = strategy.getClass().getSimpleName();
this.hands = hands;
this.userId = userId;
}
, тогда как Hand
-
@Entity // This tells Hibernate to make a table out of this class
public class Hand {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
private int p1;
private String p1s;
private int p2;
private String p2s;
private int d1;
private String d1s;
private int trials;
private int score;
public Hand() {
}