У меня есть две таблицы «ДЕЛАЕТ» и «МОДЕЛИ». Между ними отношения @ManyToOne

Таблица ДЕЛАЕТ

@Column(unique = true)
private String make;

МОДЕЛИ стола

@Column(unique = true)
private String model;

При вставке в автомобиль схемы:

makes.setMake("Porsche");
models.setModel("911");

em.persist(makes);
em.persist(models);

Все ок, данные добавлены.

Но если Porsche существует в таблице MAKES - у меня есть исключение «... Повторяющаяся запись« Porsche »для ключа ...»

0
Nikolay Grigoryev 18 Авг 2021 в 16:35

2 ответа

Лучший ответ

Эта ошибка нарушения ограничения должна произойти, чтобы предотвратить случайное выполнение того, что вы здесь делаете - вставку двух отдельных экземпляров Make, оба из которых имеют значение столбца Make «Porsche». Если вам нужно иметь несколько марок со значением «Porsche», вам нужно ослабить ограничение, чтобы разрешить дубликаты.

Что кажется более вероятным, так это то, что это задумано, и у вас есть существующая Make, которую вы хотите связать с новой моделью или под ней. Прочтите существующий make из БД и используйте этот управляемый экземпляр в контексте EntityManager вместо того, чтобы пытаться сохранить новый экземпляр Make.

Т.е.

  Query q = em.createQuery("select m from Make m where m.make = 'Porsche'");
  Make Porsche = q.getSingleResult();
  models.setModel("911");
  models.setMake(Porsche);
  em.persist(models);
0
Chris 18 Авг 2021 в 14:43

Вы должны сохранить две таблицы в двух транзакциях, если вы хотите, чтобы одна транзакция была сделана до того, как sava Make table должна проверять уникальную строку после ее сохранения. когда в одной Транзакции создают одно исключение, Транзакция реверсируется.

-1
Douran 18 Авг 2021 в 13:44