作者:何征天
课程视频地址:https://ke.qq.com/course/273907
1.1. 一对多
1.新建订单表实体类,并与客户表建立实体关系。
Customer.java
package cn.igeekdemo2;
import java.util.HashSet; import java.util.Set;
import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.OneToMany; import javax.persistence.Table;
//实体类 @Entity //表信息 @Table(name="t_customer") publicclass Customer { @Id //主键生成策略 @GeneratedValue private Integer id; private String name; private String city; //一个客户对应多个订单,使用set集合 //配置一对多注解 //mappedBy是关联对象Order类在自己的实体类中一方的属性(需要在一方配置) //order表中的外键名会根据这个值来生成,这里将生成customer_id @OneToMany(mappedBy="customer") Set<Order> orders = new HashSet<>(); //省略getter和setter方法 } |
Order.java
package cn.igeekdemo2;
import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.ManyToOne; import javax.persistence.Table;
//实体类 @Entity //表信息 @Table(name="t_order") publicclass Order { @Id @GeneratedValue private Integer id; private String name; private Double price; //一个订单对应一个客户 //配置多对一 @ManyToOne private Customer customer; //省略getter和setter方法 } |
2.映射文件加入到核心文件hibernate.cfg.xml配置:
<!-- 关联一对多javabean --> <mapping class="cn.igeekdemo2.Customer"/> <mapping class="cn.igeekdemo2.Order"/> |
3.测试TestOne2Many.java
package cn.igeekdemo2;
import org.hibernate.Session; import org.hibernate.Transaction; import org.junit.Test;
import cn.igeekutil.HibernateUtils;
publicclass TestOne2Many {
//保存数据 @Test publicvoid run2(){ Session session = HibernateUtils.getCurrentSession(); Transaction tr = session.beginTransaction(); //新建一个客户 Customer c = new Customer(); c.setName("美美"); //新建2个订单 Order o1 = new Order(); o1.setName("A字短裙");
Order o2 = new Order(); o2.setName("清新长裙");
//关联 o1.setCustomer(c); o2.setCustomer(c); //保存 session.save(c); session.save(o1); session.save(o2);
tr.commit(); }
@Test publicvoid run1(){ HibernateUtils.getCurrentSession(); } } |
更多详细配置:
Customer.java
Order.java
1.2. 多对多
示例:学生和课程
1.建立实体类,并加上注解:
Student.java
package cn.igeekdemo2;
import java.util.HashSet; import java.util.Set;
import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.ManyToMany; import javax.persistence.Table;
@Entity @Table(name="t_student") publicclass Student { @Id @GeneratedValue private Integer id; private String name;
//多对多set集合 //配置多对多关系 @ManyToMany private Set<Course> courses = new HashSet<>();
//省略getter和setter方法 } |
Course.java
package cn.igeekdemo1;
import java.util.HashSet; import java.util.Set;
import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.ManyToMany; import javax.persistence.Table;
@Entity @Table(name="t_course") publicclass Course { @Id @GeneratedValue private Integer id; private String name;
//多对多Set集合 //配置多对多关系 @ManyToMany(mappedBy="courses") //必须在某一方配置外键关联字段 //应该配置中间表的信息,如果不配置,默认中间表的名字就是表名1_表名2,字段是各自的:实体类名字_id private Set<Student> students = new HashSet<>(); //省略getter和setter方法 } |
2.在核心配置文件中配置映射hibernate.cfg.xml:
<!-- 关联多对多javabean --> <mapping class="cn.igeekdemo2.Student"/> <mapping class="cn.igeekdemo2.Course"/> |
3.新建TestMany2Many类测试
package cn.igeekdemo2;
import org.hibernate.Session; import org.hibernate.Transaction; import org.junit.Test;
import cn.igeekutil.HibernateUtils;
publicclass TestMany2Many { //保存数据 @Test publicvoid run2(){ Session session = HibernateUtils.getCurrentSession(); Transaction tr = session.beginTransaction(); //1.新建一个学生 Student s = new Student(); s.setName("冠希"); //2.新建一门课程 Course c = new Course(); c.setName("java"); //3.关联 s.getCourses().add(c); c.getStudents().add(s); //4.保存 session.save(s); session.save(c);
tr.commit(); }
@Test publicvoid run1(){ HibernateUtils.getCurrentSession(); } } |
【更多配置】: