2016-02-03 32 views
5

W języku Java można opisać klasę jako @Embeddable lub ustawić właściwość jako @Embedded. Przykładowy kod:Kiedy używać @Embedded i @Embeddable?

@Embeddable 
class A{ 
... 
} 

class B{ 
... 
} 

@Entity 
class Foo { 
    A a; 
    @Embedded B b; 
} 

Kiedy wolą @Embedded i @Embeddable?

+1

Czy konsultowałeś Javadoc z tymi adnotacjami? – wero

Odpowiedz

0

to zarówno stosowane są w hibernacji z dopiskiem:

@Embeddable użytkowania złożonego klucza podstawowego.

@Wbudowana jednostka jest połączona z jednostką nadrzędną i traktowana tak samo, jakby była tam zadeklarowana przez cały czas. Czasami masz ogromną tabelę z kilkoma kolumnami (szczególnie ze starszymi bazami danych). Jednak niektóre kolumny są logicznie powiązane ze sobą (np. Ulica, miasto i numer telefonu w tabeli KLIENTA). Gdy nie chcesz utworzyć obiektu ze wszystkimi polami, utworzysz obiekt adresu osadzonego. W ten sposób logicznie grupujesz kolumny adresów w obiekt, zamiast mieć równie duże POJO z płaską listą pól.

0

Jeśli mamy osobę i adres dwa POJO, nie chcemy tworzyć kolejnej tabeli dla adresu, ale chcielibyśmy umieścić adres w tabeli osoby. Dlatego adres jest wartością dodaną do obiektu Person, ale nie ma sensu indywidualnie. W tym przypadku możemy przejść z:

@Embeddable 
public class Address{ 
} 

@Entity 
public class Person 
{ 

@Embedded 
private Address address; 

} 
3

Istnieją dwa podstawowe zastosowania dla @Embedded/@Embeddable miarę znam:

pierwsze i najważniejsze: Dzielenie dużych klas podmiotu. W świecie bazy danych duża tabela (jedna z wieloma kolumnami) jest w porządku. Rozbicie takiej tabeli może nawet pogorszyć sytuację i być w konflikcie z zasadami projektowania baz danych. Z drugiej strony w języku Java (lub ogólnie w językach zorientowanych obiektowo) duża klasa to code smell. Tutaj chcielibyśmy podzielić klasy, w tym klasy jednostek, na mniejsze jednostki. @Embedded/@Embeddable pozwala nam to łatwo zrobić bez konieczności dzielenia tabeli bazy danych.

Po drugie, pozwala na ponowne wykorzystanie typowych mapowań między jednostkami. Powiedzmy, że każda tabela ma proste śledzenie wersji, z dwiema kolumnami zawierającymi nazwę użytkownika osoby, która zmieniła wiersz i czas, w którym to się stało. Następnie można utworzyć encję @Embeddable pokrywającą te wiersze, a następnie ponownie wykorzystać ją dla wszystkich encji, osadzając ją (zamiast powtarzać zmienne odpowiadające tym kolumnom w każdej jednostce).

Powiązane problemy