@OneToOne однонаправленный и двунаправленный - PullRequest
10 голосов
/ 24 февраля 2012

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

Однонаправленное отображение

@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.
}

Двунаправленное картографирование

@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.
}

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

Ответы [ 2 ]

19 голосов
/ 24 февраля 2012

Потому что вы не поняли, как отображается двунаправленный 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) в целевом объекте.

4 голосов
/ 08 марта 2013

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

@OneToOne
private Address43 address;

@OneToOne
private Customer44 customer;

Теперь вам не нужно выполнять соединение.Я не уверен, хорошая ли это практика или нет.Просто убедитесь, что у вас нет КАСКАДОВ.

...