tl; dr
Bunun anahtarı Bahar Veri REST çok şey değil - kolayca alabilirsiniz sizin senaryoda çalışmak - ama modeliniz dernek her iki ucunu tutar emin senkron.
Burada gördüğünüz sorun Bahar Veri DİNLENME temelde AuthorEntity
ait books
özelliğini değiştirir aslında doğar sorunu. Bu, bu güncelleştirmeyi BookEntity
'un authors
özelliğinde yansıtmaz. Bunun elle çalışılması gerekir. Bu, Spring Data REST'in oluşturduğu bir kısıtlama değil, JPA'nın genel olarak çalıştığı bir kısıtlamadır. Hatalı davranışı sadece setleyicileri manuel olarak çağırarak ve sonucu devam ettirmeye çalışarak çoğaltabileceksiniz.
Bu nasıl çözülür?
İki yönlü ilişkilendirmeyi kaldırmak bir seçenek değilse (bunu önerdiğim için aşağıya bakın), bu çalışmayı gerçekleştirmenin tek yolu, ilişkilendirmede değişikliklerin her iki tarafa yansıtıldığından emin olmaktır. Genellikle insanlar bir kitap eklendiğinde elle BookEntity
konusu yazarı ekleyerek bu özen:
class AuthorEntity {
void add(BookEntity book) {
this.books.add(book);
if (!book.getAuthors().contains(this)) {
book.add(this);
}
}
}
fıkra yanı sen emin olmak istiyorsanız BookEntity
tarafta eklenecek giderdi eğer ek Diğer taraftan değişiklikler de yayılır. if
temel olarak gereklidir, aksi takdirde iki yöntem sürekli olarak kendilerini çağırır.
Yay Verme DESTEĞİ, varsayılan olarak, bu mantığı gerçekten kullanabileceğiniz hiçbir yöntem olmaması için alan erişimini kullanır. Bir seçenek mülk erişimine geçmek ve mantığı ayarlayıcılara koymak olacaktır. Başka bir seçenek, varlıklar üzerinde yineleyen ve değişikliklerin her iki tarafa da yansıtmalarını sağlayan @PreUpdate
/@PrePersist
ile açıklamalı bir yöntem kullanmaktır. konuyla
Gördüğünüz gibi temel nedenini Çıkarma
, bu etki alanı modeline karmaşıklık oldukça fazla ekler.
# çift yönlü dernekler 1 kuralı: Dün Twitter'da espri yaptı gibi bunları kullanmayın ... :)
Eğer iki yönlü kullanmamaya çalışın eğer Genellikle konuyu kolaylaştırır Mümkün olduğu zaman ilişki ve derneğin arka tarafını oluşturan tüm varlıkları elde etmek için bir depoya geri dönün.
Hangi tarafın kesileceğini belirlemek, iyi bir sezgisel olup, derlemenin hangi tarafının modellendiğiniz etki alanı için gerçekten temel ve çok önemli olduğunu düşünmektir. Sizin durumunuzda, bir yazarın onun tarafından yazılmış bir kitap olmadan var olmasının mükemmel olduğunu iddia ederim. Kapak tarafında, yazar olmayan bir kitap hiç de fazla anlam ifade etmiyor. Bu yüzden BookEntity
içinde authors
özelliği tutmak ancak BookRepository
üzerinde şu yöntemi tanıştırırdım:
interface BookRepository extends Repository<Book, Long> {
List<Book> findByAuthor(Author author);
}
Evet, şimdi bir depo ile çalışmak daha önce sadece author.getBooks()
çağrılan olabilirdi tüm müşterilerine gerektirir. Ancak olumlu tarafta, tüm kabalıklarınızı etki alanlarınızdan kaldırdınız ve bu arada kitaptan yazara net bir bağımlılık yönü yarattınız. Kitaplar yazarlara dayanır, ancak diğer yoldan değil.
Çift yönlü çağrışımların, genellikle setçilerin içinde yapılan nesne modelinde elle tutulması gerekir. Spring Data REST, alan erişimini varsayılan olarak kullanır. Derneklerdeki değişimin, dernek tarafından diğer tarafa da yansıtılmadığı anlamına gelir. Senkronizasyonu bir '@ PrePersist' /' @ PreUpdate' yönteminde denediniz mi? Veya mülk erişimine mi geçin? –
İki yönlü ilişkiyi çözmek için de oy kullanacağım. “Yazar” bir “Kitap” olmadan var olabilir. 'Yazar' için bir' Yazar' bir depo yöntemi kullanılarak alınabilir ' BookRepository.findByAuthor (Yazar yazar)'. Bu, referansları elle tutmak zorunda kalmayacağınız için modeli oldukça basitleştirir. –
Bir yazar bulmanız gereken bir kütüphane arayüzü görebiliyordum, sonra kitaplarını görebiliyordum. Bu iki yönlü dernekler olmadan desteklenmezdi. DATA REST'in amacı değilse, kuruluş ilişkilerini yönetme fanı değil. Girdiğin için teşekkürler, yazarların kitaplarının filtrelenmesi en iyi yaklaşım gibi görünüyor. Mümkün olduğunda işleri tek yönlü tutmamak. :) – keaplogik