Дублирование с CascadeType - PullRequest
       2

Дублирование с CascadeType

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

Я сейчас немного запутался. У меня есть три таблицы: specialPrice, партнер, продукт.

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

Эти три таблицы также представлены как сущности в моем Java-приложении. Вот моя проблема: если я хочу сохранить одну специальную цену, я получаю следующее исключение:

Caused by: java.lang.IllegalStateException: During synchronization a new object was found through a relationship that was not marked cascade PERSIST: 0.

сообщение об ошибке полезно, я должен использовать CascadeType, хорошо. НО, если я использую CascadeType.ALL, будет создана specialPrice (так что больше не будет java.lang.IllegalStateException), но в продукте и в таблице партнеров выбранный партнер и продукт будут продублированы ... Я не понимаю как это возможно?

SpecialPrice Entity:

@Basic(optional = false)
@NotNull
@Column(name = "DISCOUNT_RATE")
private int discountRate;

@JsonBackReference
@JoinColumn(name = "PRODUCT_ID", referencedColumnName = "ID")
@ManyToOne(optional = false)
private Product productId;

@JsonBackReference
@JoinColumn(name = "PARTNER_ID", referencedColumnName = "ID")
@ManyToOne(optional = false)
private Partner partnerId;

ссылка от партнера. Организация:

@JsonIgnore
@OneToMany(mappedBy = "partnerId")
private Collection<SpecialPrice> specialPriceCollection;

(то же самое для продукта)

Использование EclipseLink (JPA 2.1)

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

Спасибо!

1 Ответ

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

Я понимаю, Partner и Product являются уже существующими объектами?

В таком случае попробуйте следующий код в вашем методе обслуживания:

specialPrice.setPartner(partnerRepository.getOne(specialPrice.getPartnerId().getId());
specialPrice.setProduct(productRepository.getOne(specialPrice.getProductId().getId());
specialPriceRepository.save(specialPrice);

Как примечание, использование CascadeType.ALL с @ManyToOne почти никогда не является хорошей идеей.

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