Ale wtedy Jackson nie serializuje pola podczas konwersji na JSON ... jak rozwiązać?
MobileMon,
zależy to od zaprojektowania Twojej aplikacji. jeśli dodasz adnotację do swojej klasy bytu - ma ona zastosowanie wszędzie; ale jeśli zanotujesz dao używającego bytu - to inna historia. w skrócie: używaj DAO, gdy masz wiele magazynów
Andrii Plotnikov
Nie działa na polach listy. W przypadku pól typu Kolekcja hibernacja faktycznie tworzy nową tabelę pośrednią. Jakieś obejście tego?
Używam JAX-RS 2.0.1 / Jersey 2.25.1 / Jackson 2.8.7 i przy tym stosie @JsonIncludenie jest konieczne: @Transientpola są nadal zawarte w JSON. (Nadal masz mój głos: sama technika może być bardzo przydatna w innych okolicznościach).
DKroot
2
Zrobiłem to na Spring Boot
Kamil Nekanowicz,
cześć, próbuję tego użyć, ale nie jest serializowany z polem @Transient
Mohammad
@Mohammad dodaj adnotację @JsonInclude ()
Kamil Nekanowicz
Próbowałem tego w Spring Boot 2.1.7, ale nie działało. Ale wciąż dostajesz mój głos, ponieważ może działać w innych scenariuszach.
Aditya Ekbote
25
Aby zignorować pole, oznacz je adnotacją, @Transientaby nie było mapowane przez hibernację.
Źródło: Hibernacja Adnotacje .
Ta odpowiedź przychodzi trochę później, ale uzupełnia odpowiedź.
Aby uniknąć utrwalenia pola z encji w DB, można użyć jednego z dwóch mechanizmów:
@Transient - adnotacja JPA oznaczająca pole jako nietrwałe
przejściowe słowo kluczowe w java. Uwaga - użycie tego słowa kluczowego uniemożliwi użycie pola z dowolnym mechanizmem serializacji z języka Java. Tak więc, jeśli pole musi być zserializowane, lepiej użyć tylkoadnotacji @Transient .
a może po prostu chcę zignorować upór przy pobieraniu metody ?. Na przykład: myjparepository.save () zapisze model jak zwykle, a myjparepository.find (id) zignoruje pole, które chcę?
xtiger
@xtiger możesz utworzyć niestandardowe zapytanie w celu zarchiwizowania tej funkcjonalności. Oto przykładowy link
Mohale
7
Istnieje wiele rozwiązań w zależności od typu atrybutu encji.
Podstawowe atrybuty
Rozważ, że masz następującą accounttabelę:
accountStół jest mapowany do Accountpodmiotu takiego:
Podstawowe atrybuty podmiotu są odwzorowane do kolumn tabeli, więc właściwości podoba id, iban, centsto podstawowe atrybuty.
Ale dollars, interestCentsi interestDollarssą obliczane właściwości, więc opisywać je @Transientwyłączyć je z SELECT, INSERT, UPDATE i DELETE SQL.
Zatem w przypadku podstawowych atrybutów należy użyć @Transient, aby wykluczyć utrwalenie danej właściwości.
Aby uzyskać więcej informacji na temat atrybutów jednostki obliczanej, sprawdź ten artykuł .
Wspomnienia
Zakładając, że masz następujące elementy posti post_commenttabele:
Chcesz zmapować lastestComment powiązanie w Postencji na najnowszą PostComment, która została dodana.
Aby to zrobić, możesz użyć @JoinFormula adnotacji:
@Entity(name ="Post")@Table(name ="post")publicclassPost{@IdprivateLong id;privateString title;@ManyToOne(fetch =FetchType.LAZY)@JoinFormula("("+"SELECT pc.id "+"FROM post_comment pc "+"WHERE pc.post_id = id "+"ORDER BY pc.created_on DESC "+"LIMIT 1"+")")privatePostComment latestComment;//Getters and setters omitted for brevity}
Podczas pobierania Post encji widać, że latestCommentjest ona pobierana, ale jeśli chcesz ją zmodyfikować, zmiana zostanie zignorowana.
Tak więc, w przypadku skojarzeń, możesz użyć @JoinFormula aby zignorować operacje zapisu, jednocześnie umożliwiając odczytanie powiązania.
Aby uzyskać więcej informacji o skojarzeniach obliczeniowych, sprawdź ten artykuł .
@MapsId
Innym sposobem na zignorowanie powiązań, które są już zamapowane przez identyfikator jednostki, jest użycie @MapsId .
Rozważmy na przykład następującą relację jeden do jednego:
PostDetailsJednostka jest odwzorowany tak:
@Entity(name ="PostDetails")@Table(name ="post_details")publicclassPostDetails{@IdprivateLong id;@Column(name ="created_on")privateDate createdOn;@Column(name ="created_by")privateString createdBy;@OneToOne(fetch =FetchType.LAZY)@MapsIdprivatePost post;publicPostDetails(){}publicPostDetails(String createdBy){
createdOn =newDate();this.createdBy = createdBy;}//Getters and setters omitted for brevity}
Zauważ, że zarówno idatrybut, jak i postpowiązanie odwzorowują tę samą kolumnę bazy danych, która jest post_detailskolumną Klucz podstawowy.
Aby wykluczyć idatrybut, @MapsIdadnotacja poinformuje Hibernację, że postskojarzenie zajmuje się wartością kolumny Klucz podstawowy tabeli.
Tak więc, gdy identyfikator jednostki i powiązanie mają tę samą kolumnę, możesz użyć, @MapsIdaby zignorować atrybut identyfikatora jednostki i zamiast tego użyć powiązania.
Aby uzyskać więcej informacji na temat @MapsId, sprawdź ten artykuł .
Za pomocą insertable = false, updatable = false
Inną opcją jest użycie insertable = false, updatable = false powiązania, które ma być ignorowane przez Hibernację.
Na przykład możemy zmapować poprzednie powiązanie jeden do jednego w następujący sposób:
Zauważ, że zarówno atrybut id, jak i asocjacja post mapują tę samą kolumnę bazy danych, która jest kolumną Klucz podstawowy post_comment. Czy jest to poprawne w kontekście posti post_detailstabel jako przykładu?
David
1
Dzięki za wykrycie tego. Naprawiłem to.
Vlad Mihalcea
3
Aby wypełnić powyższe odpowiedzi, miałem przypadek przy użyciu pliku odwzorowania XML, w którym ani @Transientnor nie transientdziałał ... Musiałem umieścić informacje przejściowe w pliku xml:
Żadna z powyższych odpowiedzi nie działała dla mnie przy użyciu Hibernacji 5.2.10, Jersey 2.25.1 i Jackson 2.8.9. W końcu znalazłem odpowiedź (w pewnym sensie, odwołują się one do hibernacji4moduła, ale działa również dla 5) tutaj . Żadna adnotacja Jsona w ogóle nie działała @Transient. Najwyraźniej Jackson2 jest „wystarczająco inteligentny”, aby uprzejmie zignorować rzeczy oznaczone, @Transientchyba że wyraźnie to powiesz. Kluczem było dodanie modułu hibernacji5 (którego używałem do obsługi innych adnotacji Hibernacji) i wyłączenie tej USE_TRANSIENT_ANNOTATIONfunkcji w mojej aplikacji Jersey:
Po wypróbowaniu każdej innej metody wspomnianej powyżej i innych, @JsonProperty@JsonInclude@JsonSerialize + @JsonDeserializemapper.configure(MapperFeature.PROPAGATE_TRANSIENT_MARKER, false));to rozwiązanie w końcu zadziałało. Dzięki!
Aby zignorować pole, opatrz je adnotacją,
@Transient
aby nie było mapowane przez hibernację.ale wtedy Jackson nie serializuje pola podczas konwersji na JSON.
Jeśli potrzebujesz wymieszać JPA z JSON (pomiń JPA, ale nadal dołączasz do Jacksona) użyj
@JsonInclude
:WSKAZÓWKA:
Możesz także użyć JsonInclude.Include.NON_NULL i ukryć pola w JSON podczas deserializacji, gdy
token == null
:źródło
@JsonInclude
nie jest konieczne:@Transient
pola są nadal zawarte w JSON. (Nadal masz mój głos: sama technika może być bardzo przydatna w innych okolicznościach).Aby zignorować pole, oznacz je adnotacją,
@Transient
aby nie było mapowane przez hibernację.Źródło: Hibernacja Adnotacje .
źródło
Ta odpowiedź przychodzi trochę później, ale uzupełnia odpowiedź.
Aby uniknąć utrwalenia pola z encji w DB, można użyć jednego z dwóch mechanizmów:
@Transient - adnotacja JPA oznaczająca pole jako nietrwałe
przejściowe słowo kluczowe w java. Uwaga - użycie tego słowa kluczowego uniemożliwi użycie pola z dowolnym mechanizmem serializacji z języka Java. Tak więc, jeśli pole musi być zserializowane, lepiej użyć tylkoadnotacji @Transient .
źródło
Istnieje wiele rozwiązań w zależności od typu atrybutu encji.
Podstawowe atrybuty
Rozważ, że masz następującą
account
tabelę:account
Stół jest mapowany doAccount
podmiotu takiego:Podstawowe atrybuty podmiotu są odwzorowane do kolumn tabeli, więc właściwości podoba
id
,iban
,cents
to podstawowe atrybuty.Ale
dollars
,interestCents
iinterestDollars
są obliczane właściwości, więc opisywać je@Transient
wyłączyć je z SELECT, INSERT, UPDATE i DELETE SQL.Wspomnienia
Zakładając, że masz następujące elementy
post
ipost_comment
tabele:Chcesz zmapować
lastestComment
powiązanie wPost
encji na najnowsząPostComment
, która została dodana.Aby to zrobić, możesz użyć
@JoinFormula
adnotacji:Podczas pobierania
Post
encji widać, żelatestComment
jest ona pobierana, ale jeśli chcesz ją zmodyfikować, zmiana zostanie zignorowana.@MapsId
Innym sposobem na zignorowanie powiązań, które są już zamapowane przez identyfikator jednostki, jest użycie
@MapsId
.Rozważmy na przykład następującą relację jeden do jednego:
PostDetails
Jednostka jest odwzorowany tak:Zauważ, że zarówno
id
atrybut, jak ipost
powiązanie odwzorowują tę samą kolumnę bazy danych, która jestpost_details
kolumną Klucz podstawowy.Aby wykluczyć
id
atrybut,@MapsId
adnotacja poinformuje Hibernację, żepost
skojarzenie zajmuje się wartością kolumny Klucz podstawowy tabeli.Za pomocą
insertable = false, updatable = false
Inną opcją jest użycie
insertable = false, updatable = false
powiązania, które ma być ignorowane przez Hibernację.Na przykład możemy zmapować poprzednie powiązanie jeden do jednego w następujący sposób:
Te
insertable
iupdatable
atrybuty@JoinColumn
adnotacji poinstruuje Hibernate zignorowaćpost
stowarzyszenie ponieważ podmiot identyfikator dba opost_id
kolumnie klucz podstawowy.źródło
post
ipost_details
tabel jako przykładu?Aby wypełnić powyższe odpowiedzi, miałem przypadek przy użyciu pliku odwzorowania XML, w którym ani
@Transient
nor nietransient
działał ... Musiałem umieścić informacje przejściowe w pliku xml:źródło
Żadna z powyższych odpowiedzi nie działała dla mnie przy użyciu Hibernacji 5.2.10, Jersey 2.25.1 i Jackson 2.8.9. W końcu znalazłem odpowiedź (w pewnym sensie, odwołują się one do hibernacji4moduła, ale działa również dla 5) tutaj . Żadna adnotacja Jsona w ogóle nie działała
@Transient
. Najwyraźniej Jackson2 jest „wystarczająco inteligentny”, aby uprzejmie zignorować rzeczy oznaczone,@Transient
chyba że wyraźnie to powiesz. Kluczem było dodanie modułu hibernacji5 (którego używałem do obsługi innych adnotacji Hibernacji) i wyłączenie tejUSE_TRANSIENT_ANNOTATION
funkcji w mojej aplikacji Jersey:Oto zależność dla Hibernate5Module:
źródło
@JsonProperty
@JsonInclude
@JsonSerialize + @JsonDeserialize
mapper.configure(MapperFeature.PROPAGATE_TRANSIENT_MARKER, false));
to rozwiązanie w końcu zadziałało. Dzięki!Czasami chcesz:
Posługiwać się
@Column(name = "columnName", insertable = false, updatable = false)
Dobrym scenariuszem jest automatyczne obliczanie określonej kolumny przy użyciu innych wartości kolumny
źródło