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