2012-02-23 2 views
9

У меня есть два примера, которые в первую очередь представляют собой однонаправленное отображение @OneToOne и второе двунаправленное. В однонаправленном сопоставлении таблица со стороны владельца должна содержать столбец объединения, который ссылается на идентификатор другой таблицы; то в двунаправленном оба они должны содержать столбец внешнего ключа друг для друга. Но после создания схемы базы данных с помощью стратегии автогенерации два примера оказывают одинаковое влияние на схему базы данных. Однонаправленное отображение является нормальным, но двунаправленный пример содержит только один столбец внешнего ключа, но он должен включать внешний ключ друг друга!@OneToOne однонаправленный и двунаправленный

Однонаправленного Mapping

@Entity 
public class Customer43 { 

@Id 
@GeneratedValue 
private Long id; 
private String firstName; 
private String lastName; 
private String email; 
private String phoneNumber; 
@OneToOne 
@JoinColumn(name = "address_fk") 
private Address43 address; 

// Getters, Setters and Constructors. 
} 

@Entity 
public class Address43 { 

@Id 
@GeneratedValue 
private Long id; 
private String street1; 
private String street2; 
private String city; 
private String state; 
private String zipcode; 
private String country; 

// Getters, Setters and Constructors. 
} 

Двунаправленного Mapping

@Entity 
public class Customer44 { 

@Id 
@GeneratedValue 
private Long id; 
private String firstName; 
private String lastName; 
private String email; 
private String phoneNumber; 
@OneToOne 
@JoinColumn(name = "address_fk") 
private Address43 address; 

// Getters, Setters and Constructors. 
} 

@Entity 
public class Address44 { 

@Id 
@GeneratedValue 
private Long id; 
private String street1; 
private String street2; 
private String city; 
private String state; 
private String zipcode; 
private String country; 
@OneToOne(mappedBy = "address") 
private Customer44 customer; 

// Getters, Setters and Constructors. 
} 

Почему выход схемы базы данных одинаково и почему двунаправленное отображение действует как однонаправленные?

ответ

19

Поскольку вы не понимали, как отображается двунаправленный OneToOne. Вам не нужны два внешних ключа. Один из них является достаточным для выполнения соединения между обеими таблицами, в обоих направлениях:

select a.* from address a inner join customer c on c.addressId = a.id; 
select c.* from customer c inner join address a on c.addressId = a.id; 

Тот факт, что ассоциация является однонаправленной или двунаправленной не меняется, как таблицы связаны между собой. Он просто изменяет отображение и позволяет перемещаться по ассоциации в обоих направлениях.

В двунаправленной ассоциации у вас всегда есть собственная сторона (которая рассказывает, как сопоставляется ассоциация, используя этот столбец соединения) и обратную сторону, где вы просто говорите: «Я - другая сторона ассоциации, которая это поле (поле в значении атрибута mappedBy) в целевом объекте.

+1

Итак, в чем их преимущество или недостаток? –

+9

Преимущество однонаправленной связи заключается в том, что ее легче управлять, потому что вам нужно поддерживать только одну сторону. Преимущество двунаправленной ассоциации заключается в том, что вы можете перемещаться по ней в обоих направлениях (получить адрес клиента или получить клиента по адресу). –

+0

применимо ли это к OneToMany и ManyToOne? –

4

У меня был только эксперимент. Если вы просто сделаете это ниже, обе таблицы будут иметь внешние ключи:

@OneToOne 
private Address43 address; 

@OneToOne 
private Customer44 customer; 

Теперь вам не нужно делать соединение. Я не уверен, что это хорошая практика или нет. Просто убедитесь, что у вас нет CASCADES.

Смежные вопросы