Отдельная сущность передана для сохранения многим многим с дополнительным столбцом - PullRequest
0 голосов
/ 30 октября 2018

Я хочу создать связь «многие ко многим» с дополнительным столбцом. Я настроил это:

@Entity
public class Configuration extends AbstractEntity {

    @OneToMany(
            mappedBy = "configuration",
            cascade=CascadeType.ALL,
            orphanRemoval = true
    )
    @JsonIgnore
    private List<ConfigurationQuestion> configurationQuestions = new ArrayList<>();


    public void addQuestion(QuestionDTO question) {
        ConfigurationQuestion configurationQuestion = new ConfigurationQuestion(this,
                question.getQuestion(), question.getResponse());

        configurationQuestions.add(configurationQuestion);
    }

}

Присоединиться к столу

@Entity
public class ConfigurationQuestion implements Serializable {
    @EmbeddedId
    private ConfigurationQuestionId id ;

    @ManyToOne(fetch = FetchType.LAZY)
    @MapsId("configurationId")
    private Configuration configuration;


    @ManyToOne(fetch = FetchType.EAGER)
    @MapsId("questionId")
    @JoinColumn(name="question_id")
    private Question question;

    private Integer response; 

    public ConfigurationQuestion(Configuration configuration, Question question,
                                 Integer response) {
        this.configuration = configuration;
        this.question = question;
        this.response = response;
        this.id = new ConfigurationQuestionId(configuration.getId(), question.getId());
    }

}

Встраиваемый идентификатор

@Embeddable
public class ConfigurationQuestionId implements Serializable {

    private Long configurationId;

    private Long questionId;
}

В вопросе у меня нет картирования, я хочу сделать это в одном направлении. Моя проблема, когда я пытаюсь сохранить что-то вроде этого. Я хочу сохранить конфигурацию, в которой в качестве вопроса задан только идентификатор, а не весь объект, он сохраняется отдельно.

В сущности Вопрос у меня нет отображения, я хочу сделать это в одном направлении. Моя проблема, когда я пытаюсь сохранить что-то вроде этого. Я хочу сохранить конфигурацию, в которой в качестве вопроса / вопросов используются только идентификаторы не всех объектов, она сохраняется отдельно.

Configuration configuration = new Configuration();
Question question = new Question();
question.setId(1L);

configuration.addQuestion(new QuestionDTO(question, 1));

repository.save(configuration);

Я получаю следующую ошибку. Я не хочу каскадно вносить изменения в сущность Вопрос, если я удаляю Cascade.ALL из Конфигурации, ничего не вставляя в таблицу соединений. Могу ли я сделать это, не найдя вопросов?

detached entity passed to persist: Question

1 Ответ

0 голосов
/ 30 октября 2018

Если вы не хотите Cascade ваших изменений от сущности Configuration к сущности Question, вы должны сохранить ее отдельно. Провайдер JPA вправе жаловаться на то, что переданный объект все еще отсоединен. Это все еще просто старый экземпляр объекта Java, JPA EntityManager не знает об этом.

Попробуйте сохранить Question отдельно перед сохранением объекта Configuration.

Если у вас уже есть Question в базе данных, вы знаете его идентификатор, но хотите не получить его полностью, вы можете использовать метод getReference(), который возвращает прокси для вашего Entity , Поставщик JPA по-прежнему будет иметь некоторые издержки для проверки того, что экземпляр существует (он должен выдать EntityNotFoundException, если он не существует), но должен быть более легким.

Если вы используете Spring Data JpaRepository, существует аналогичный метод с неловким названием getOne(), который по сути делает то же самое (он вызывает EntityManager.getReference()).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...