hibernate对象关系

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,172评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,346评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,788评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,299评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,409评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,467评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,476评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,262评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,699评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,994评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,167评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,827评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,499评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,149评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,387评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,028评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,055评论 2 352

推荐阅读更多精彩内容