Czy istnieje sposób odwzorowania obliczonej właściwości za pomocą JPA?Mapowanie właściwości z JPA
Zakładając mam obiektu Invoice
z jednym lub więcej InvoiceLineItems
w nim, chcę mieć trwałą właściwość obliczona na klasy Invoice
że daje mi całkowitą kwotę:
class Invoice {
...
@Column(name = "TOTAL_AMOUNT")
public BigDecimal getTotalAmount() {
BigDecimal amount = BigDecimal.ZERO;
for (InvoiceLineItem lineItem : lineItems) {
amount = amount.add(lineItem.getTotalAmount());
}
return amount;
}
}
Teraz mogę utworzyć chronione no-op setTotalAmount
metoda, aby uczynić JPA szczęśliwym, ale zastanawiałem się, czy istnieje sposób, aby umożliwić WZP wiedzieć, że mapowanie jest tylko w jedną stronę i uniknąć tworzenia zbędnej metody setera.
Dzięki, Aleks
Znakowanie nieruchomość jako @Transient nie pomoże mi. Nie chcę, aby JPA to zignorowało - chcę, aby całkowita kwota utrzymywała się w bazie danych, więc mogę prosić o nią bezpośrednio, bez konieczności agregowania informacji z tabeli podrzędnej. To, o co pytam, to jak utrzymać wyliczoną właściwość (w sensie Java, zupełnie niezwiązanym z wytrwałością) bez konieczności wprowadzania niepotrzebnego ustawiacza dla niej. –
Twój przykład jest raczej dziwny. Jeśli ** przechowujesz ** tę wartość i pytasz o nią, dlaczego przeliczasz ją w swoim efekcie? Najważniejsze jest jednak to, że jeśli przypisujesz metodę getter (w przeciwieństwie do właściwości), musisz mieć odpowiedni program ustawiający (może być prywatny), aby JPA wypełniało tę wartość w twoim obiekcie. – ChssPly76
Podany przeze mnie przykład jest nadmiernym uproszczeniem modelu domeny, z którym pracuję, który ma kilka poziomów relacji od jednej do wielu, z obliczoną właściwością na każdym poziomie, który zależy od dzieci. Obliczanie wartości w Javie w razie potrzeby jest znacznie łatwiejsze niż próba aktualizacji sumy, ponieważ obiekty potomne w (głębokiej) hierarchii są dodawane, usuwane lub modyfikowane, dlatego też ponownie je przeliczam. –