JPA używanie id zamiast całego obiektu

JPA używanie id zamiast całego obiektu
0

Cześć!

Proste pytanie, ale nie mogę znaleźć

Mam prosty kod

Kopiuj
@Entity
public class A {

    @Id
    @GeneratedValue(strategy = AUTO)
    private Long id;

    private String name;

    @ManyToOne
    @JoinColumn(name="b_id")
    private B b;

    protected Pet() {}

    public A(String name, B b) {
        this.name = name;
        this.b = b;
    }
}

Gdzie B to też jakieś entity. Teraz chcę robiąc POST do /b wysłać jsona typu:

Kopiuj
{
  "name": "Hello, World",
  "bId": 1
}

zamiast

Kopiuj
{
  "name": "Hello, World",
  "b": {
   milion pól z b
  }
}

Jak to rozwiązać? Dzięki!

Kuba_or_JJ
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 2 lata
  • Postów:27
0

Pokaż może więcej kodu odpowiadającego za tworzenie JSONA który przesyła A do B, może tam możesz się odwołać tylko do pola id podczas przesyłania obiektu jako JSON ?

jarekczek
  • Rejestracja:prawie 8 lat
  • Ostatnio:ponad 4 lata
  • Lokalizacja:Siemianowice Śląskie
  • Postów:500
2

Rozwiązuje się to przez DTO. Encji bazodanowych używa się tylko we wnętrzu projektu, a nie do komunikacji ze światem zewnętrznym.

Czy da się to zrobić tak, jak próbujesz? Hmm... Zacząć można od tego: https://stackoverflow.com/questions/6311776/hibernate-foreign-keys-instead-of-entities . Potem to: https://vladmihalcea.com/how-to-update-only-a-subset-of-entity-attributes-using-jpa-and-hibernate/ (bo Vlada zawsze trzeba przeczytać, jak wyskakuje w google'u). Po różnych próbach i kombinacjach wychodzi mi, że można tak:

W relacji A->B nie ustawiamy kaskady, więc każdy zapis B musimy ręcznie inicjować (em.save(b)). Wtedy mamy możliwość zrobić taki trik:

Kopiuj
B b = new B();
b.id = 12345;
a.b = b;

Nie spowoduje to utworzenia nowego obiektu, a tylko zapisanie odpowiedniego id w rekordzie typu A. Czyli zamiast miliona pól z B używasz tylko jednego: id. Zrobiłem podobny test tutaj.

Jest jeszcze możliwość ustawienia podwójnego mapowania pola b, przez referencję i przez id. Ale tylko jedno z nich może być zapisywalne (updatable = true), więc i tak nie udałoby się eleganco zorganizować wariantu jsonowego bId = "5".


Przeważnie ignoruję niezarejestrowanych użytkowników.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.