【问题标题】:@OneToOne unidirectional and bidirectional@OneToOne 单向和双向
【发布时间】:2012-03-14 07:44:39
【问题描述】:

我有两个例子,第一个是@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.
}

双向映射

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

为什么数据库架构输出相同,为什么双向映射像单向一样?

【问题讨论】:

    标签: jpa one-to-one bidirectional-relation


    【解决方案1】:

    因为您不了解双向 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 属性值中的字段)映射。

    【讨论】:

    • 那么,它们的优缺点是什么?
    • 单向关联的好处是更容易管理,因为你只需要维护一侧。双向关联的优点是您可以双向导航(获取客户的地址,或获取地址的客户)。
    • 这是否适用于 OneToMany 和 ManyToOne?
    • 适用什么?单向与双向的优点和缺点对于所有关联都是相同的。对于多对多,您需要一个连接表。
    【解决方案2】:

    我刚刚对此进行了实验。如果您只是在下面执行此操作,则两个表都将具有外键:

    @OneToOne
    private Address43 address;
    
    @OneToOne
    private Customer44 customer;
    

    现在您不需要进行连接。我不确定这是否是一个好习惯。只要确保您没有 CASCADE。

    【讨论】:

      猜你喜欢
      • 2012-09-28
      • 1970-01-01
      • 1970-01-01
      • 2013-08-19
      • 2012-10-14
      • 1970-01-01
      • 1970-01-01
      • 2021-07-14
      • 1970-01-01
      相关资源
      最近更新 更多