Cześć,
mam taki przypadek:
class Product {
@OneToMany(cascade = { CascadeType.MERGE, CascadeType.PERSIST }, mappedBy = "product")
private Set<Action> actions;
public void addAction(Action action) {
if (Objects.isNull(actions)) {
actions = new HashSet<>();
}
actions.add(action);
action.setProduct(this);
}
}
class Action {
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "PRODUCT_ID")
private Product product;
}
Action action = new Action();
Product product = findProductById().orElseGet(() -> new Product()));
product.addAction(action);
saveAndFlush(product);
Long id = action.getId();
No i teraz w przypadku gdy findProductById()
nie zwróci nic to tworzymy nowy Product
, wsadzamy mu tam Action
i zapisujemy, wtedy product.getActions().contains(action) == true
i action
ma założmy ID = 1
, tak samo jak w utworzonym produkcie - zachodzi em.persist
(saveAndFlush jest ze Spring Data JPA).
Natomiast w odwrotnym przypadku gdy findProductById()
zwróci jakiś produkt i wsadzimy mu action
to po zapisie product.getActions().contains(action) == false
, bo
action
ma ID = null
natomiast akcja w produkcie ma normalnie nadany ID - np. 2 - zachodzi em.merge
.
Problemu by nie było, gdyby nie to że potem potrzebne jest mi action.getId()
. Nie mogę też zapisać najpierw action
, a potem product
, bo action
ma na bazie not null
na polu product
. W dodatku to nie jest jedyna encja powiązana z Product
, którą muszę tu zapisać. Teraz pytanie jak ładnie wyciągnąć ten id action
z pojazdu, bo myślę że niemożliwym jest osiągnąć aby product.getActions().contains(action)
w drugim przypadku (merge) było true
- czyli żeby przy mergu nie tworzyło mi nowego obiektu action
gdzieś w środku.