关联关系有两个分类
1.单向关系:只需单向访问关联端。例如,只能通过老师访问学生,或者只能通过学生来访问老师。
单向1------》1
1)无连接表的1---1关联
---个人实体类
package entity;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToOne;
@Entity
public class Person {
@Id
@Column(name="person_id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
private String name;
private int age;
// 定义该Person实体关联的Address实体
@OneToOne(targetEntity=Address.class)
//@JoinColumn增加了unique=true,这就意味着在person_inf表的address_id外键列上
//增加唯一约束---实际上形成了单向1-----1关联
@JoinColumn(name="address_id",referencedColumnName="address_id",unique=true)
private Address address;
//省略所有的getter和setter方法。。。
public Person() {
super();
}
}
----地址实体类
package entity;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
@Entity
public class Address {
@Id
@Column(name = "address_id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int addressId;
private String addressDetail;
//省略所有getter和setter方法。。。
public Address() {
super();
}
}
---生成的表结构
-----个人表
-----地址表
2)有连接表的1---1关联
-----------------------------------------------------------------------------------------------------------------------------------------------------------
单向1------》N
-----------------------------------------------------------------------------------------------------------------------------------------------------------
单向N------》1
1)无连接表的N----1关联
--个人实体类
package entity;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.CascadeType;
@Entity
public class Person {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
private String name;
private int age;
// 定义该Person实体关联的Address实体
@ManyToOne(targetEntity = Address.class)
@JoinColumn(name = "address_id", nullable = false)
@Cascade(CascadeType.ALL)
private Address address;
//省略所有get和set方法。。。
public Person() {
super();
}
}
--地址实体类
package entity;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
@Entity
public class Address {
@Id
@Column(name = "address_id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int addressId;
private String addressDetail;
//省略所有getter、setter方法。。。
public Address() {
super();
}
}
--生成的表结构
----个人表
-----地址表
2)有连接表的N----1关联
----个人实体类
package entity;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToOne;
import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.CascadeType;
@Entity
public class Person {
@Id
@Column(name="person_id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
private String name;
private int age;
// 定义该Person实体关联的Address实体
@ManyToOne(targetEntity = Address.class)
//显示使用@JoinTable映射连接表
@JoinTable(name="person_address",//指定连接表名为person_address
//指定连接表中person_id外键列,参照到当前实体对应表的外键列
joinColumns=@JoinColumn(name="person_id",referencedColumnName="person_id",unique=true),
//指定连接表中address_id外键列,参照到当前实体的关联实体对应表的外键列
inverseJoinColumns=@JoinColumn(name="address_id",referencedColumnName="address_id")
)
@Cascade(CascadeType.ALL)
private Address address;
//省略所有getter和setter方法。。。
public Person() {
super();
}
}
---地址实体类
package entity;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
@Entity
public class Address {
@Id
@Column(name = "address_id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int addressId;
private String addressDetail;
//省略所有getter和setter方法
public Address() {
super();
}
}
--生成的表结构
---个人表
---地址表
---个人地址连接表
--------------------------------------------------------------------------------------------------------------------------------------------------------
单向N------》N(N---N必须使用连接表)
--------------------------------------------------------------------------------------------------------------------------------------------------------
2.双向关系:关联的两端可以互相访问。例如,老师和学生之间可以互相访问。
双向1------》1
双向1------》N
双向N------》N