Java Developer? Przejd藕 na wy偶szy poziom wiedzy 馃敟馃挭 聽Sprawd藕

Team Leader? Podnie艣 efektywno艣膰 swojego zespo艂u 馃憣聽Sprawd藕

Anotacje w Hibernate, kt贸re warto zna膰 馃挕

utworzone przez Hibernate, Java

Cze艣膰! Witaj w kolejnym wpisie z Hibernate.

Zanim jednak do tego przejd臋… W naszym newsletterze w ostatniej wiadomo艣ci prosi艂em nasz膮 ma艂膮 spo艂eczno艣膰 o udzia艂 w ankiecie na temat Programu Java Developera. Odzew by艂 MEGA 馃挭. Zaskoczy艂o nas to, jak dobrze zosta艂 przyj臋ty! Dzi臋ki!

Dopinamy ostatnie kwestie techniczne, rendery materia艂贸w, wprowadzamy poprawki po review i za kilka tygodni oddamy w Twoje r臋ce Program Java Developera聽馃殌

12 modu艂贸w udost臋pnianych tydzie艅 po tygodniu, 40 godzin lekcji video, sporo fajnych technologii i DO呕YWOTNI dost臋p do materia艂贸w.

Do rzeczy, co z tymi anotacjami!

Wst臋p

Korzystaj膮c z Hibernate czy te偶 Java Persistence API dla konfiguracji mapowania danych i operacji przewa偶nie korzysta si臋 z anotacji (jest tak偶e mo偶liwo艣膰 konfiguracji poprzez pliki XML). Korzystasz z @Entity, @Id dla definicji encji i ewentualnie odpowiednik贸w @Table i @Column dla wskazania miejsca w bazie danych dla tych danych.

Id膮c dalej, skorzystasz z auto-generacji identyfikator贸w @GeneratedValue, mapowania danych z wykorzystaniem @Convert, @Lob, @Enumerated czy @Temporal. Mo偶esz zdefiniowa膰 relacje, u偶yjesz @Query/@NamedQuery czy @NativeQuery dla definicji zapyta艅.

Ale zar贸wno Hibernate jak i JPA dostarczaj膮 wielu dodatkowych anotacji, z kt贸rych chcia艂bym Ci przedstawi膰 kilka wybranych.

Eeee tam, znowu hibernate i podstawy…

Ale mo偶e Ci臋 zaskocz臋 馃檪 Przeczytaj dalej i聽daj zna膰 w komentarzu, czy znasz te anotacje聽i czy u偶ywa艂e艣 ich w projekcie!

We wpisie przeczytasz o

  • @DynamicUpdate – bardziej sprytne generowanie zapyta艅
  • @Immutable
  • @Transient
  • @Formula – i tu mo偶na co艣 bardzo optymalizowa膰, je偶eli to koniecznie
  • Automatyczna data utworzenia i modyfikacji: @CreationTimestamp oraz @UpdateTimestamp

Wydajno艣膰 Hibernate

Tw贸rz szybko dzia艂aj膮ce aplikacje z wydajn膮 i zoptymalizowan膮 obs艂ug膮 bazy danych.

@DynamicUpdate

Anotacja DynamicUpdate pakietu org.hibernate.annotations w艂膮cza inteligentny tryb wykrywania zmian. Zapytania generowane przez Hibernate, reprezentuj膮ce instrukcj臋 UPDATE b臋d膮 zawiera艂y tylko kolumny, kt贸re si臋 zmieni艂y dla encji, dla kt贸rej anotacja zosta艂a dodana.

Istnieje r贸wnie偶 anotacja @DynamicInsert. Dla tej anotacji instrukcje INSERT b臋d膮 zawiera艂y tylko kolumny, kt贸rych warto艣膰 jest r贸偶na od null.

Poni偶ej masz przyk艂ad kodu

@Entity
@DynamicUpdate
public class Card {

    @Id
    String cardId;

    @Convert(converter = YesNoBooleanConverter.class)
    Boolean enabled;

    @Enumerated(EnumType.STRING)
    CardCountry cardCountry;

    BigDecimal balance;

    @Temporal(TemporalType.DATE)
    Calendar expiresAt;
}

Je偶eli np. zmodyfikujesz warto艣膰 balance, to wygenerowane zapytanie SQL b臋dzie wygl膮da艂o nast臋puj膮co

update
        cards 
    set
        balance=?,
        country=?,
        enabled=?,
        expires_at=?
    where
        card_id=?

Po dodaniu @DynamicUpdate wygenerowane zapytanie b臋dzie zawiera艂o tylko zmienion膮 kolumn臋

update
        cards 
    set
        balance=?
    where
        card_id=?

@Immutable

Anotacja Immutable pakietu org.hibernate.annotations w艂膮cza mechanizm, kt贸ry nie pozwala na zmian臋 danych encji. Takie encje mo偶na dodawa膰 i usuwa膰, ale nie mo偶na ich modyfikowa膰. Nawet je偶eli zmienisz warto艣膰 pola w tej encji, to Hibernate zignoruje te zmiany i instrukcja UPDATE nie zostanie wys艂ana.

Anotacja mo偶e tak偶e by膰 umieszczona nad polem, w贸wczas zasi臋g ograniczony jest do p贸l oznaczonych t膮 encj膮.

Psst… Interesuj膮cy artyku艂?

Je偶eli podoba Ci si臋 ten artyku艂 i chcesz takich wi臋cej – do艂膮cz do newslettera. Nie omin膮 Ci臋 materia艂y tego typu.

.

@Transient

Jest to anotacja JPA i jest dost臋pna w pakiecie javax.persistence. Mo偶na j膮 ustawi膰 dla pola, przez co pole jest oznaczone jako nie persystentne. Hibernate nie obs艂uguje takich p贸l (nie b臋dzie ich szuka艂 ani aktualizowa艂). Mo偶e to by膰 wykorzystane do chwilowego wt艂oczenia dodatkowych danych czy na przyk艂ad wstawienia daty odczytu encji z bazy danych.

Uwaga. Nale偶y ostro偶nie podchodzi膰 do tego typu p贸l – np. co si臋 ma sta膰 z takim polem i encj膮 po EntityManager.refresh czy te偶 po commit (data odczytu mo偶e ju偶 nie mie膰 sensu).

@Formula

Anotacja znajduje si臋 w pakiecie javax.persistence i pozwala na dodanie pola, do kt贸rego zostanie wstrzykni臋ty wynik natywnego zapytania SQL. Pole takie jest polem tylko do odczytu.

Przyk艂adowo chcia艂by艣 wy艣wietli膰 list臋 u偶ytkownik贸w z informacj膮 o liczbie kart. Poni偶ej masz przyk艂ad kodu z relacj膮 OneToMany

@Entity
public class User {
    @Id
    String userId;

    String firstName;

    String lastName;

    @OneToMany(fetch = FetchType.EAGER)
    @JoinColumn(name = "CARD_OWNER_ID")
    List<Card> userCards;    
}

Wywo艂uj膮c zapytanie HQL/JPQL b臋dzie musia艂 uwa偶a膰 na problem N=1 i u偶y膰 np. left join fetch.

var usersListNoNPlus1 = entityManager.createQuery(
                "from User u left join fetch u.userCards",
                User.class).getResultList();

Maj膮c list臋 u偶ytkownik贸w, dla ka偶dego sprawdzisz ile ma kart – ale przecie偶 nie potrzebowa艂e艣 w tej logice doci膮ga膰 danych wszystkich kart.

Mo偶esz zrobi膰 to z wykorzystaniem @Formula

@Entity
public class User {
    @Id
    String userId;

    String firstName;

    String lastName;

    @OneToMany(fetch = FetchType.LAZY)
    @JoinColumn(name = "CARD_OWNER_ID")
    List<Card> userCards;    
	
	@Formula("(SELECT COUNT(1) FROM SOFTWARESKILL.CARDS C WHERE C.CARD_OWNER_ID=USER_ID)")
    int cardsCount;
}

Dzi臋ki temu do pola cardsCount zostanie wstrzykni臋ta liczba kart, a relacja mo偶e by膰 zmieniona na LAZY.

Musisz zwr贸ci膰 uwag臋 na to, i偶 zapytanie SQL dla @Formula to natywne zapytanie SQL, i mo偶e nie zadzia艂a膰 na r贸偶nych rodzajach bazy danych, je偶eli b臋dzie wykorzystywa艂o jak膮艣 specyfik臋 danego silnika bazodanowego.

Automatyczna data utworzenia i modyfikacji

W Hibernate istniej膮 dwie anotacje @CreationTimestamp oraz @UpdateTimestamp, kt贸re mog膮 by膰 u偶yte do automatycznego nadawania warto艣ci dla momentu utworzenia i modyfikacji danych encji.

@Entity
public class CreditCard {
    
	@Id
    @GeneratedValue(strategy = SEQUENCE, generator = "SEQ_CARDS")
    Long cardId;
    
    @Convert(converter = YesNoBooleanConverter.class)
    Boolean enabled;

    @Enumerated(EnumType.STRING)
    CardCountry cardCountry;

    BigDecimal balance;

    @Temporal(TemporalType.DATE)
    Calendar expiresAt;

    @Temporal(TemporalType.TIMESTAMP)
    @CreationTimestamp
    Calendar createdAt;

    @Temporal(TemporalType.TIMESTAMP)
    @UpdateTimestamp
    Calendar updatedAt;
}

Uwaga. Je偶eli chcia艂by艣 wykorzysta膰 te dane, to musisz u偶y膰 EntityManager.flush, gdy偶 warto艣膰 pola jest ustawiana dopiero przy flush lub commit. Inaczej b臋dzie warto艣膰 null.

Przydatne linki

Wpis kt贸ry czytasz to zaledwie fragment wiedzy zawartej w Programie szkoleniowym Java Developera od SoftwareSkill. Mamy do przekazania sporo usystematyzowanej wiedzy z zakresu kluczowych kompetencji i umiej臋tno艣ci Java Developera. Program sk艂ada si臋 z kilku modu艂贸w w cotygodniowych dawkach wiedzy w formie video.

Wydajno艣膰 Hibernate

Tw贸rz szybko dzia艂aj膮ce aplikacje z wydajn膮 i zoptymalizowan膮 obs艂ug膮 bazy danych.

Podoba Ci si臋 ten artyku艂? We藕 wi臋cej.

Je偶eli uwa偶asz ten materia艂 za warto艣ciowy i chcesz wi臋cej tre艣ci tego typu 鈥 nie przegap ich i otrzymuj je prosto na swoj膮 skrzynk臋. Nawi膮偶my kontakt.

.

Gdyby艣 potrzebowa艂 jeszcze wi臋cej:

Jeste艣 Java Developerem?

Przejd藕 na wy偶szy poziom wiedzy 
„Droga do Seniora” 馃敟馃挭

Jeste艣 Team Leaderem? Masz zesp贸艂?

Podnie艣 efektywno艣膰 i wiedz臋 swojego zespo艂u 馃憣

Dyskusja