JPA używanie id zamiast całego obiektu

0

Cześć!

Proste pytanie, ale nie mogę znaleźć

Mam prosty kod

@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:

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

zamiast

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

Jak to rozwiązać? Dzięki!

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 ?

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:

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".

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