Rest + @OneToMany oraz @PostPersist (null dla klucza obcego)

0

Witam,
mamy metodę z adnotacją @PostPersist dla naszego obiektu A, która na kolekcji @OneToMany List<C> wykonuje jakieś zmiany
czy te zmiany będą widoczne w db?
bo wygląda na to, że nie : /

 
// A
@JsonProperty("lista")	
@OneToMany(mappedBy="a", cascade = CascadeType.PERSIST, fetch = FetchType.EAGER)
public Collection<C> cc; 

@PostPersist
for(C c : this.cc){
   c.a = this;

// C
@JsonIgnore 
@JoinColumn(name="id_a", nullable = false, insertable=true, updatable = true) 
@ManyToOne(cascade = CascadeType.ALL)
public A a;

Może coś robię źle, ale chciałbym uzyskać taki efekt:

  • wysyłamy jsona do serwisu (transakcją zarządza kontener) { namea: "testa", lista: [{namec: "testc"}]}
  • w serwisie chcemy go utrwalić, niestety dostajemy błąd klucza obcego
    Cannot insert the value NULL into column 'id_a', table 'table_c'; column does not allow nulls

przez @PostPersist klasy A próbowałem wskazać obiektowi C nową wartość właściwości a, ale to nie pomaga
pomaga tylko wykonanie kodu od @PostPersist w serwisie przed utrwaleniem (mimo, że to insert i kolumna id_a nie ma wartości)

co z tym można jeszcze zrobić?

0

Takie zachowania to już baaardzo zależą od implementacji, bo np w JPA jest:

These database operations [PostPersist/PostRemove] may occur directly after the persist, merge, or remove operations have been invoked or they may occur directly after a flush operation has occurred (which may be at the end of the transaction).
i

It is implementation-dependent as to whether callback methods are invoked before or after the cascading of the lifecycle events to related entities. Applications should not depend on this ordering

Czyli chyba może się tak zdarzyć, że najpierw poleci operacja kaskadowa PERSIST dla obiektów z listy, a dopiero potem wywoła się callback dla A (i aktualizacja listy nie zostanie zapisana), a w dodatku callback może się wykonać się już po flushu :)
Ja bym jeszcze "na małpkę" spróbował to zrobić w @PrePersist (A)

0

w @PrePersist po moim kodzie uruchamiają się generatory dla @Id, czyli @Id NIE MA wartości, ale referencje można spróbować ustawić...sprawdzę
zaskoczeniem dla mnie jest, że taka struktura JSONie i tak wymaga ręcznego przypisywania : /

// edit
zmiana @PostPersist na @PrePersist załatwiła temat (mimo braku @Id)
tylko czemu trzeba to robić ręcznie, a nie załatwia tego provider JSONa?

1 użytkowników online, w tym zalogowanych: 0, gości: 1