1.1多对多关系
1.1.1使用注解完成多对多配置。
使用manyToMany来配置多对多,只需要在一端配置中间表,另一端使用mappedby表示外键维护。
A.创建PO类
Teacher类中:
@Entity
@Table(name="t_teacher")
public class Teacher {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
private String name;
@ManyToMany(targetEntity = Student.class,mappedBy="teacher")
private Set<Student> students = new HashSet<Student>();
Student类:
@Entity
@Table(name = "t_student")
public class Student {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
private String name;
@ManyToMany(targetEntity = Teacher.class)
@JoinTable(name="s_t",joinColumns={@JoinColumn(name="c_student_id")},inverseJoinColumns={@JoinColumn(name="c_teacher_id")})
private Set<Teacher> students = new HashSet<Teacher>();
// 测试多对多级联保存,保存学生时保存老师
@Test
public void test4(){
Session session = hibernateUtils.openSession()
session.beginTransaction()
// 创建两个老师
Teacher t1 = new Teacher()
t1.setName("tommy")
Teacher t2 = new Teacher()
t2.setName("hans")
// 创建两个学生
Student s1 = new Student()
s1.setName("tommy2")
Student s2 = new Student()
s2.setName("hans2")
// 学生关联老师
s1.getTeacher().add(t1)
s1.getTeacher().add(t2)
s2.getTeacher().add(t1)
s2.getTeacher().add(t2)
// 保存学生
session.save(s1)
session.save(s2)
session.getTransaction().commit()
session.close()
}
--
2.一对一的关系
以人与身份证号为例
1.创建实体类
@Entity
@Table(name="t_user")
public class User {
@Id
@GenericGenerator(strategy="uuid",name="myuuid")
@GeneratedValue(generator="myuuid")
private String id;
private String name;
@OneToOne(targetEntity=IDCard.class,mappedBy="user")
private IDCard idCard;
t_user放弃对外键的维护权利
public class IDCard {
@Id
@GenericGenerator(strategy="uuid",name="myuuid")
@GeneratedValue(generator="myuuid")
private String id;
private String cardNum;
@OneToOne(targetEntity=User.class)
@JoinColumn(name="c_user_id")
@Cascade(CascadeType.SAVE_UPDATE)
private User user;
joincolumn指定外键列名称,当前配置外键是在t_idcard表中。
3.主键映射
Husband和wife为例:
@Entity
@Table(name = "t_wife")
public class wife {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private int id;
private String name;
@OneToOne
@PrimaryKeyJoinColumn
private Husband husband;
}
wife的主键生成策略是identity
@primaryKeyColumn说明husband与wife是使用主键映射。
@Entity
@Table(name="t_husband")
public class Husband {
@Id
@GenericGenerator(name="myForeignKey", strategy="foreign", parameters={@Parameter(name="property",value="wife")})
@GeneratedValue(generator="myForeignKey")
private int id;
private String name;
@OneToOne
@PrimaryKeyJoinColumn
private wife wife;
}
Husband的主键我们设置成参考wife的主键方式。
测试代码:
// 测试一对一主键生成策略
@Test
public void test7(){
Session session = hibernateUtils.openSession()
session.beginTransaction()
Husband husband = new Husband()
husband.setName("tommy")
wife w1 = new wife()
w1.setName("johnson")
// 双向关联
husband.setWife(w1)
w1.setHusband(husband)
session.save(w1)
session.getTransaction().commit()
session.close()
}