JPA - многие ко многим - внешний ключ нарушается при создании / обновлении - PullRequest
0 голосов
/ 07 февраля 2019

Прежде всего, извините, если мой английский не самый лучший, но я сделаю все возможное, чтобы объяснить мою проблему.

На самом деле я пытаюсь сохранить объект в моей базе данных, но у меня естьPSQLException, сказав, что я не могу сохранить без сохранения моего первого объекта (проблема внешнего ключа).

Итак, у меня есть объект, Миссия, которая содержит Фрейс.Вот мой класс:

@Entity
@Table(name = "T_MISSION")
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
@Getter
@Setter
@NoArgsConstructor
public class Mission implements Serializable {


    private static final long serialVersionUID = -8050548742704457221L;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @ManyToMany(fetch = FetchType.EAGER)
    @JoinTable(name = "t_mission_t_frais", joinColumns = {
    @JoinColumn(name = "fraiss_id") }, inverseJoinColumns = {
    @JoinColumn(name = "missions_id", referencedColumnName = "id") })
    @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
    private Set<Frais> fraiss = new HashSet<>();

}

Вот мой класс "Frais":

@Entity
@Table(name = "T_FRAIS")
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
@Getter
@Setter
@NoArgsConstructor
public class Frais implements Serializable {

    private static final long serialVersionUID = -4881527916470482329L;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @ManyToMany(mappedBy = "fraiss")
    private Set<Mission> missions = new HashSet<>(0);

}

Как вы можете видеть, когда я пытаюсь сохранить новую миссию, я хочу сохранить свои данныев таблице базы данных с именем 't_mission_t_frais', которая содержит fraiss_id и missions_id.

Но пока я не могу сохранить ее причину этой ошибки: 'org.postgresql.util.PSQLException: ERROR: оператор вставки или обновления втаблица "t_mission_t_frais" нарушает внешнее ограничение ключа "fk_frais_mission_id". Подробно: Ключ (missions_id) = (60261) отсутствует в таблице "t_mission". '

Вот мой сервис MissionService:

@Service
@Transactional
public class MissionService {
    @Autowired
    private MissionRepository missionRepository;

    public void save(Mission mission) {
       missionRepository.save(mission);
    }
 }

Поскольку я новичок в Java, я думаю, что что-то не так настроил в своем классе Миссии, но я думаю, что моя миссия не была сохранена первой (до первой), которая блокирует транзакцию сохранения ...

Я уже пытался заменить 'save' на 'saveAndFlush' и делать другие вещи без результата, который я хотел бы ...

Можете ли вы, ребята, помочь мне, если у вас есть какие-нибудь идеи?

РЕДАКТИРОВАТЬ:

моя миссия создается с помощью фронтального приложения (Angular) и отправляется в формате JSON.Вот пример:

id: 67114,
fraiss: [
    {
        actif: true
        fraisType: {id: 44881, libelle: "Indemnité", actif: true}
        actif: true
        id: 44881
        libelle: "Indemnité"
        id: 60261
        libelle: "53,50€ par nuité"
        missions: []
    },
    {
        actif: true
        fraisType: {id: 136, libelle: "Frais", actif: true}
        actif: true
        id: 136
        libelle: "Frais"
        id: 23986
        libelle: "54€ par jour"
        missions: []
    }
]

@RequestMapping(value = "/rest/manage/missions", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE)
     public void create(@RequestBody Mission mission) {
         log.debug("REST request to save Mission : {}", mission);
         missionService.save(mission);
     }

1 Ответ

0 голосов
/ 08 февраля 2019

Проблема была в конфигурации моего JPA.Сохранение миссии было неправильным: это было три раза, чтобы сохранить в моем t_mission_t_frais (fraiss_id, missions_id) новое значение (missions_id, fraiss_id), возникло исключение PSQLE, потому что миссия не существовала

В моемКласс миссии, мой "JOIN TABLE" был объявлен неправильно:

@ManyToMany(fetch = FetchType.EAGER)
    @JoinTable(name = "t_mission_t_frais",
        joinColumns = { @JoinColumn(name = "missions_id", referencedColumnName = "id") },
        inverseJoinColumns = { @JoinColumn(name = "fraiss_id", referencedColumnName = "id") })
    @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
    private Set<Frais> fraiss = new HashSet<>();

Но только эта модификация делала меня стековым потоком, поэтому мне пришлось изменить и мой класс Frais:

@ManyToMany
@JoinTable(name = "t_mission_t_frais",
    joinColumns = { @JoinColumn(name = "missions_id", referencedColumnName = "id") },
    inverseJoinColumns = { @JoinColumn(name = "fraiss_id", referencedColumnName = "id") })
private Set<Mission> missions = new HashSet<>(0);

И теперь я могу сохранять свои объекты!Спасибо Саймон за помощь!

...