2013-08-27 13 views
24

ich keinen Unterschied in dem Schema einer Viele-zu-Eins-Beziehung vs einer OneToOne Beziehung sehen: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; 

Gibt es einen Unterschied?

Antwort

28

Sie sehen auf Schema genau gleich aus, aber es gibt Unterschiede auf Hibernate Layer.

Wenn Sie so etwas versuchen:

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

Alles wird in Ordnung sein. Aber nach dem Speichern, wenn Sie versuchen, Bestellung:

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

@ManyToOne case: 
SUCCESS 

Natürlich sollte Ihre Adresse Klasse in beiden Fällen anders aussehen.

+0

Also sollte es mir gut gehen, zwischen den beiden Mappings zu wechseln? –

+1

Was meinst du mit "zwischen den beiden Mappings wechseln"? Wenn Sie ein bestehendes Datenbankschema haben und sich dafür entscheiden, die Mapping-Annotation in Ihrer Anwendung zu ändern, können Sie dies tun, ohne das Schema zu ändern (von @OneToOne zu @ManyToOne). Auf andere Weise können Sie es auch tun, aber Sie können Probleme mit Daten haben. – paulek

+1

Für jeden, der pauleks Beitrag in der Zukunft liest: Ihre Berechtigungen müssen _just so_ sein, um diesen Fehler zu bekommen. Wenn Sie nur unidirektionale Beziehungen haben, wird dieser Fehler nicht angezeigt. Wenn Sie bidirektionale Beziehungen haben, wird nur ein Select auf Adressen mit Join, der die Aufträge abruft, diesen Fehler erzeugen. –

5

Normalerweise sollte eine eindeutige Einschränkung für die Join-Spalte address_id im Fall einer OneToOne-Verknüpfung vorhanden sein, um sicherzustellen, dass nur eine Bestellung eine bestimmte Adresse haben kann.

+0

Dies scheint nicht der Fall zu sein –

+0

Zumindest mit MySQL erstellt es den Fremdschlüssel mit einem Index des Typs "Unique". – borjab

0

Dies zeigt an, dass beide Seiten der Beziehung am besten durch den gleichen Primärschlüssel bedient werden. Es makes more sense dieser Weg, da beide Seiten nur eine Bestellung im Fall der @OneToOne Beziehung zugeordnet sind.

Verwandte Themen