@OneToOne单向和双向

Rah*_*sta 10 jpa one-to-one bidirectional-relation

我有两个例子,第一个是@OneToOne单向映射和第二个双向映射.在单向映射中,拥有方表必须包含引用另一个表的id的连接列; 然后在双向中它们都必须包含彼此的外键列.但是在使用自动生成策略生成数据库模式之后,两个示例对数据库模式具有相同的效果.单向映射是正常的,但双向示例只包含一个外键列,但它必须涉及彼此的外键!

单向映射

@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.
}
Run Code Online (Sandbox Code Playgroud)

双向映射

@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.
}
Run Code Online (Sandbox Code Playgroud)

为什么数据库模式输出相同,为什么双向映射就像单向?

JB *_*zet 20

因为您不了解双向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;
Run Code Online (Sandbox Code Playgroud)

关联是单向或双向的这一事实不会改变表的链接方式.它只是更改映射,并允许在两个方向上导航关联.

在双向关联中,您总是拥有一个拥有方(告诉关联如何映射,使用哪个连接列),以及一个反面,您只需说:我是由此映射的关联的另一面mappedBy目标实体中的字段(属性值中的字段).

  • 单向关联的优势在于它更易于管理,因为您只需要维护一方.双向关联的优点是您可以在两个方向上导航(获取客户的地址,或获取地址的客户). (9认同)