拥有方到底意味着什么?一些映射示例(一对多,一对一,多对一)的解释是什么?
以下文本摘自Java EE 6文档中对@OneToOne的描述.你可以看到这个概念拥有方在里面.
定义与具有一对一多重性的另一个实体的单值关联.通常不必明确指定关联的目标实体,因为它通常可以从被引用的对象的类型推断出来.如果关系是双向的,则非拥有方必须使用OneToOne批注的mappedBy元素来指定拥有方的关系字段或属性.
我有两个例子,第一个是@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 …Run Code Online (Sandbox Code Playgroud) @Entity
public class Person {
@Id
@GeneratedValue
private int personId;
@OneToOne(cascade=CascadeType.ALL, mappedBy="person", fetch=FetchType.LAZY)
private PersonDetail personDetail;
//getters and setters
}
@Entity
public class PersonDetail {
@Id
@GeneratedValue
private int personDetailId;
@OneToOne(cascade=CascadeType.ALL,fetch=FetchType.LAZY)
private Person person;
//getters and setters
}
Run Code Online (Sandbox Code Playgroud)
当我做
Person person1=(Person)session.get(Person.class, 1);
Run Code Online (Sandbox Code Playgroud)
我看到两个问题被解雇了.一个用于获取人员数据,另一个用于获取人员详细数据.
根据我的理解,应该只触发1个查询,用于获取人员数据而非人员详细数据,因为我已经提到了延迟加载.为什么personDetail数据与人员数据一起被提取?