2013-08-27 33 views
24

Nie widzę żadnej różnicy w schemacie wiele-do-jednego związku vs relacji OneToOne:Hibernate ManyToOne vs OneToOne

@Entity 
public class Order { 

    @ManyToOne 
    @JoinColumn(nullable = false) 
    private Address address; 

vs

@Entity 
public class Order { 

    @OneToOne 
    @JoinColumn(nullable = false) 
    private Address address; 

Czy jest jakaś różnica?

Odpowiedz

28

Wyglądają dokładnie tak samo na schemacie, ale istnieje różnica w warstwie hibernacji.

Jeśli próbujesz coś takiego:

Address address = new Address(); 
Order order1 = new Order(); 
order1.setAddress(address); 
Order order2 = new Order(); 
order2.setAddress(address); 
save(); 

Wszystko będzie OK. Ale po zapisaniu, jeśli spróbujesz, zamów:

@OneToOne case: 
org.hibernate.HibernateException: More than one row with the given identifier was found: 1 

@ManyToOne case: 
SUCCESS 

Oczywiście twoja klasa adresu powinna wyglądać inaczej w obu przypadkach.

+0

Więc powinienem mieć się dobrze przełączać między tymi dwoma mapowaniami? –

+1

Co masz na myśli mówiąc "przełącz się między dwoma mapowaniami"? Jeśli masz istniejący schemat bazy danych i zdecydujesz się zmienić adnotacje mapowania w aplikacji, możesz to zrobić bez zmiany schematu (z @OneToOne na @ManyToOne). W inny sposób możesz to zrobić, ale możesz mieć problem z danymi. – paulek

+1

Dla każdego, kto czyta post paulek w przyszłości: Twoje uprawnienia muszą być _just so_, aby uzyskać ten błąd. Jeśli masz tylko relacje jednokierunkowe, ten błąd nie pojawi się. Jeśli masz relacje dwukierunkowe, tylko zaznaczenie w adresach z łączeniem pobierającym zamówienia spowoduje wygenerowanie tego błędu. –

5

W przypadku powiązania OneToOne należy zazwyczaj stosować wyjątkowe ograniczenie w kolumnie łączenia address_id, aby zagwarantować, że tylko jedno Zamówienie może mieć podany adres.

+0

Nie wydaje się, żeby tak było. –

+0

Przynajmniej z MySQL tworzy klucz obcy z indeksem typu "Unikatowy". – borjab

0

Oznacza to, że obie strony relacji są najlepiej obsługiwane przez posiadanie tego samego klucza głównego. W ten sposób, ponieważ obie strony są powiązane jednym i tylko jednym zamówieniem w przypadku relacji makes more sense.