2013-08-27 16 views
24

non riesco a vedere alcuna differenza nello schema di una relazione molti-a-uno contro un rapporto 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; 

C'è qualche differenza?

risposta

28

Hanno lo stesso aspetto su schema ma c'è differenza su Hibernate Layer.

Se si cerca qualcosa di simile:

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

Tutto sarà OK. Ma, dopo averlo salvato se provi, ordina:

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

@ManyToOne case: 
SUCCESS 

Naturalmente, la classe Indirizzo dovrebbe apparire diversa in entrambi i casi.

+0

Quindi dovrei andare bene per passare tra i due mapping? –

+1

Cosa intendi per "passare tra i due mapping"? Se si dispone di uno schema di database esistente e si decide di modificare l'annotazione di mapping nell'applicazione, è possibile farlo senza modificare lo schema (da @OneToOne a @ManyToOne). In altri modi puoi anche farlo, ma puoi avere problemi con i dati. – paulek

+1

Per chi legge il post di paulek in futuro: le tue istanze devono essere _solo così_ per ottenere quell'errore. Se hai solo relazioni unidirezionali, quell'errore non comparirà. Se si dispone di relazioni bidirezionali, solo una selezione sugli indirizzi con join durante il recupero degli ordini genererà quell'errore. –

5

Di norma, nella colonna di join address_id nel caso di un'associazione OneToOne deve esistere un vincolo univoco, per garantire che solo un ordine possa avere un determinato indirizzo.

+0

Questo non sembra essere il caso –

+0

Almeno con MySQL crea la chiave esterna con un indice di tipo "Unico". – borjab

0

Questo indica che entrambi i lati della relazione sono serviti meglio avendo la stessa chiave primaria. È makes more sense in questo modo poiché ad entrambi i lati è associato un solo ed unico ordine nel caso della relazione @OneToOne.