@OneToOne однонаправленный и двунаправленный
У меня есть два примера: первый - однонаправленное отображение @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 ответа
Потому что вы не поняли, как сопоставляется двунаправленный 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
значение атрибута) в целевом объекте.
Я только что провел эксперимент на этом. Если вы просто сделаете это ниже, обе таблицы будут иметь внешние ключи:
@OneToOne
private Address43 address;
@OneToOne
private Customer44 customer;
Теперь вам не нужно делать соединение. Я не уверен, хорошая ли это практика или нет. Просто убедитесь, что у вас нет КАСКАДОВ.