@OneToMany bez odwrotnej relacji i bez tabeli join?

Jest to podobny problem do "Hibernate @OneToMany bez oddzielnej tabeli join" , ponieważ potrzebuję relacji @OneToMany bez tabeli join. Chciałbym jednak również nie definiować odwrotnej relacji. Usunięcie odwrotności wydaje się skutkować automatycznym generowaniem tabeli łączenia... czy można to obejść?

Author: Community, 2010-01-19

3 answers

W JPA 2.0 + możesz użyć @JoinColumn jako sposobu na uniknięcie generowania połączonych tabel.

Spróbuj.
@OneToMany
@JoinColumn(name="COLUMN_NAME")

UPDATE

Informacje podane powyżej zostały wyodrębnione z książki EJB 3.0 O ' Reilly (poszukaj adnotacji @ JoinColumn odwołującej się do kolumny CUSTOMER_ID w tabeli telefonów). Jednak zwykła Specyfikacja JPA 1.0 nie obsługuje tej funkcji. What it says is

Jednokierunkowe relacje jeden do wielu mogą być zaimplementowane za pomocą jednego do wielu mapowania kluczy obcych, jednak takie wsparcie nie jest wymagane w tym wydaniu. Aplikacje, które chcą używać strategii mapowania klucza obcego dla relacji jeden do wielu powinny uczynić te relacje dwukierunkowymi, aby zapewnić przenośność

Więc W 1.0 jest to implementacja specyficzna dla dostawcy (i ma to sens, autor pracuje w JBoss - Red hat divison za hibernate)

Ale jest wspierany przez implementację JPA 2.0

Jeśli połączenie jest dla jednokierunkowego mapowania OneToMany przy użyciu strategii mapowania klucza obcego, klucz obcy znajduje się w tabeli jednostki docelowej .

 48
Author: Arthur Ronald,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-16 10:52:10

Specyfikacja JPA 1.0 nie obsługuje jednokierunkowego mapowania OneToMany bez tabeli łączenia .

I używanie JoinColumn Na OneToMany nie jest dozwolone w standard JPA 1.0 (tylko na OneToOne, ManyToOne lub ManyToMany). Jest to jednak w JPA 2.0.

Ze specyfikacji JPA 1.0:

2.1.8.5.1 Jednokierunkowe Związki Onetomańskie

Stosuje się następujące wartości domyślne mapowania:

Encja A jest mapowana do tabeli nazwane A. Encja B jest mapowana do tabeli nazwane B. Istnieje tabela łączenia o nazwie A_B (nazwa właściciela pierwszy). Tabela ta ma dwa kolumny z kluczem obcym. Jeden klucz obcy kolumna odnosi się do Tabeli A i ma ten sam typ co klucz podstawowy tabeli A. Nazwa tego klucza obcego kolumna powstaje jako konkatenacja z następujących: nazwa podmiotu A;"_"; nazwa klucza głównego kolumna w tabeli A. Inne zagraniczne kolumna kluczowa odnosi się do tabela B i ma tego samego typu co klucz podstawowy Tabela B i jest unikalny klucz ograniczenie. Nazwa tego kolumna klucza obcego tworzy się jako konkatenacja: nazwa właściwości związku lub pole podmiotu a;"_"; nazwa kolumna klucza głównego w tabeli B.

Podsumowując, jeśli nie chcesz tabeli Join (i pełnej obsługi odczytu/zapisu) i nadal chcesz być zgodny z JPA, upewnij się, że skojarzenie jest dwukierunkowe (z inverse side).

Poniższy link do książki wiki omawia sztuczkę (mapowanie tabeli docelowej jako tabeli łączenia), aby "obejść" problem, ale to działa tylko dla odczytów, zapisów nie będzie działać.

Referencje

 15
Author: Pascal Thivent,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-18 23:13:05

Jeśli nie ma tabeli join w bazie danych, wtedy relacja między dwiema tabelami w bazie danych zostanie osiągnięta za pomocą klucza obcego odnoszącego się do klucza podstawowego. Jeśli relacja jest przez PK / FK, musi istnieć właściwość w klasie docelowej, która odwołuje się z powrotem do źródła, tak aby kolumna FK została wypełniona wartością. Ta właściwość w klasie docelowej może być id lub obiektem źródłowym. Jeśli jest to obiekt źródłowy, musisz mieć odwrotną @ManyToOne w klasie docelowej.

 0
Author: dinesh ranawat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-20 16:01:16