Hibernate是一款ORM框架,对JDBC进行了轻量级的对象封装。
简单来说,现在主流数据库,都是关系模型的。
但程序却是面对对象的。
hibernate 的作用就是让我们可以用面对对象的思想来操作关系型数据库。
简化了传统DAO层的代码量。并且更加符合面向对象原则。这就是对象-关系映射
常见对象关系
1对1: 学生和学生证
1对多:1位老师我多位学生
多对多:商品和顾客
(1拷jar包2拷utils包中的HibernateXMLAutoCreateUtils.java3配置cfg.xml 4建类 5写main方法生成(manytoone)hbm.xml文件(会报错正常)6改hbm.xml文件<one-to-one name="per" class="entity.Person" cascade="all"></one-to-one>)
1对1关系
即在一个对象中存在另一个对象的引用
单向1对1主键
IdCard c1=new IdCard("1101031978423Xyy");
Person per=new Person("李小龙345ewr", c1);
//session.save(per);
cascade若设成all,删除人也会删除对应的证
双向1对1主键
IdCard c1=new IdCard();
c1.setCardNo("456466701155454454x");
Person per=new Person("李小龙3465756dfg", c1);
session.save(per);
单向1对1外键
public class IdCard {
private int id;
private String cardNo;
public class Person {
private int pid;
private String name;
private IdCard card;
<many-to-one name="idCard" class="entity.IdCard" cascade="all" lazy="false" unique="true">
必须是all,不然会报错
另一个什么都没有
IdCard c1=new IdCard("1234456664333");
Person per=new Person("zhangsan",c1);
session.save(per);
或者
IdCard c1=new IdCard();
c1.setCardNo("1234456664333");
Person per=new Person("zhangsan",c1);
session.save(per);
双向1对1外键
public class IdCard {
private int id;
private String cardNo;//有set get方法
private Person per;
public class Person {
private int pid;
private String name;
private IdCard card;
<one-to-one name="per" class="entity.Person" cascade="all"></one-to-one>
<many-to-one name="idCard" class="entity.IdCard" cascade="all" lazy="false" unique="true"></many-to-one>
Person per=new Person();
per.setName("赵子龙");
IdCard c1=new IdCard("456466701155454454x",per);
//session.save(c1);
1对多关系
单向1对多关系
public class Student {private int sid;private String name;private float score;
public class Teacher {//1对多方,多属性要用Set集合private int id;private String name;private String kc;private Setstu=new HashSet();
HibernateXMLAutoCreateUtils.createHibernatePOJOMappingManyToOne(Student.class, "sid","student_tab", Teacher.class, "id","teacher_tab");(自动生成hbm.xml文件)
<set name="stu" lazy="false" cascade="all"><key colimn="id"/><one-to-many class="com.hw.entity.Student"/></set>
另一个没有
Student stu1=new Student("刘能",98);Student stu2=new Student("王英",82);Setset=new HashSet();
set.add(stu1);set.add(stu2);
Teacher tea=new Teacher("谢大脚", "唱歌", set);
//session.save(tea);//添加教师
双向1对多关系
public class Student {private int sid;private String name;private float score;private Teacher tea;
public class Teacher {//双向1对多方,多属性要用Set集合private int id;private String name;private String kc;private Setstu=new HashSet();
(自动生成hbm.xml文件)老师外键设成cascade=all时 删除学生会报错
s<many-to-one name="tea" cascade="save-update" lazy="false" column="id" class="com.hw.entity.Teacher"/>
t<set name="stu" lazy="false" cascade="none" ><key column="id"/><one-to-many class="com.hw.entity.Student"/></set>
这里如果设置(权限反转,交给多的一方)inverse=true cascade="all" 会删不掉
Set<Student>set=new HashSet<Student>();
Teacher tea=new Teacher("王大拿", "相声", set);
Student stu1=new Student("小沈阳",100,tea);
Student stu2=new Student("刘能",77,tea);
set.add(stu1);set.add(stu2);
//session.save(tea);
多对多
多对多(many-to-many):在操作和性能方面都不太理想,所以多对多的映射使用较少,实际使用中最好转换成一对多的对象模型;hibernate会为我们创建中间关联表(中间表),转换成两个一对多。
public class Student {
private int sid;
private String sname;
private float score;
private Set<teacher> set=new HashSet<Teacher>();
public class Teacher {//多对多关系:双方都要用Set集合
private int tid;
private String tname;
private String lesson;//课程
private float money;//工资
private Set<Student> stu=new HashSet<Student>();
Student.hbm.xml
<set name="tea" table="teacher_student" lazy="false"><key column="sid"/>
<many-to-many class="com.hw.entity.Teacher" column="tid"/></set>
Teacher.hbm.xml
<set name="stu" table="teacher_student" lazy="false" cascade="all"><key column="tid"/><many-to-many class="com.hw.entity.Student" column="sid"/></set>
cascade="all" 自己加
Student stu1 = new Student();stu1.setSname("刘能");stu1.setScore(88);Student stu2 = new Student();stu2.setSname("赵四");stu2.setScore(98);Student stu3 = new Student();stu3.setSname("刘英");stu3.setScore(100);Setset = new HashSet();set.add(stu1);set.add(stu2);set.add(stu3);Teacher tea = new Teacher("谢大脚", "唱歌", 15800, set);session.save(tea);
cascade几种取值
cascade(级联)几种取值:
save-update: 级联保存(load以后如果子对象发生了更新,也会级联更新). 但它不会级联删除
delete: 级联删除, 但不具备级联保存和更新
all: 级联删除, 级联更新,但解除父子关系时不会自动删除子对象.
delete-orphan:删除所有和当前对象解除关联关系的对象
none:...
级联保存和级联更新总是集合在一起的, 所以没单独的save 或 update
网友评论