2015-07-01 14 views
9

Próbowałem pominąć , pomijając adnotację i nadal pola zostały osadzone w tabeli. Nie mogę znaleźć niczego, co mogłoby oznaczać, że adnotacja @Embedded jest opcjonalna.Czy adnotacja JPA @Embedded jest obowiązkowa?

Czy to jest lub czy nie jest to opcjonalne?

Poniższy kod

@Embeddable 
public class Address { 
    String city; 
    String street; 
} 

@Entity 
public class Person { 
    String name; 
    @Embedded // it seems that it works even if this annotation is missing!? 
    Address address; 
} 

generuje zawsze tej samej tabeli

person 
    name 
    city 
    street 

nawet jeśli robię nie określić @Embedded.


Moja konfiguracja:

  • JBoss EAP 6.4.0
  • hibernacji-WZP-2,0-api-1.0.1.Final-RedHat-3.jar

Specyfikacja JPA mówi:

http://docs.oracle.com/javaee/7/api/javax/persistence/Embedded.html

@javax.persistence.Embedded

określenie trwałe pole lub właściwości jednostki, której wartość jest wystąpienie do osadzenia klasy. Klasa embedable musi być opisana jako Embedable.

http://docs.oracle.com/javaee/7/api/javax/persistence/Embeddable.html

@javax.persistence.Embeddable

Określa klasę, której instancje są przechowywane jako nieodłączna część podmiotu będącego właścicielem i podziel się tożsamości jednostki. Każda z trwałych właściwości lub pól obiektu osadzonego jest mapowana do tabeli bazy danych dla encji.

+1

Już sam to znalazłeś. Nie ma wymogu, aby @Embedded w specyfikacji. Więc myślę, że to jest descision realizacji. Byłoby interesujące zobaczyć, czy OpenJPA i EclipseLink robią to samo. – kromit

+0

Jak mówi kromit, do sprzedawcy. Ten, którego używam (DataNucleus JPA) interpretuje Embedable jako "instancje tej klasy są zawsze osadzone". Specyfikacja JDO z drugiej strony ma wyraźne adnotacje/XML, które pozwalają użytkownikowi odróżnić "wystąpienia tej klasy są zawsze osadzone", a "wystąpienia tej klasy są osadzone tylko wtedy, gdy pole jest oznaczone jako takie". –

+1

Ogólnie rzecz biorąc, API stara się być jak najbardziej konwencją nad konfiguracją, więc wiele adnotacji lub parametrów adnotacji jest faktycznie opcjonalnych, gdy jest do nich dobrze zdefiniowana domyślna. To jest doskonały przykład; jeśli klasa jest wbudowana, jest to całkiem bezpieczne założenie, że gdy jest używana w jednostce, należy ją traktować jako osadzoną. Push przychodzi, aby wdrożyć, może sprawdzić dane meta bazy danych, aby sprawdzić, czy tak rzeczywiście jest, czy nie. – Gimby

Odpowiedz

1

W przypadku korzystania ze stanu hibernacji nie ma znaczenia, czy samemu przypisano adnotację do tego pola (jako @Embedded), czy też przypisano przypisaną klasę (jako @Embeddable). Przynajmniej jedno z nich jest potrzebne, aby pozwolić Hibernacji określić typ.

I jest (implicite) oświadczenie o tym wewnątrz dokumentacji hibernacji, spójrz tutaj: http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html/mapping.html#mapping-declaration-component

Mówi:

Podmiot Osoba ma dwie właściwości komponentu, homeAddress i urodzony w. Właściwość homeAddress nie została odnotowana, ale Hibernate odgadnie, że jest to składnik trwały, szukając adnotacji @Embeddable w klasie Address.

0

Embedded-Embeddable nie jest obowiązkowy, ale daje wgląd w perspektywę OOP relacji twoich podmiotów. Innym sposobem na zrobienie czegoś takiego jest użycie mapowania OneToOne. Ale w takim przypadku jednostka zostanie zapisana do osobnej tabeli (podczas gdy w przypadku osadzenia może zostać zapisana do oddzielnej tabeli w twoim DB).

+1

Przykro mi, moje pytanie brzmi * nie * dotyczy * całej * pary '@ Embedded'-' @ Embeddable'. Pytanie brzmi: ** jeśli ** podam '@ Embeddable', czy ** muszę również ** określać' @ Embedded'? Z eksperymentów wydaje się, że odpowiedź brzmi * nie *, jednak nie mogę znaleźć tego wprost w dokumentacji. –

Powiązane problemy