Hibernate学习笔记3

网友投稿 747 2022-05-30

hibernate学习笔记3

学习课程:

13_

多对一关联映射.avi

Hibernate_03_manyToone

14_

一对一主键关联映射_单向.avi

Hibernate_04_oneToone_pk_1

14_

一对一主键关联映射_双向.avi

Hibernate_05_oneToone_pk_2

16_

一对一唯一外键关联映射_单向.avi

Hibernate_06_oneToone_upk_1

16_

一对一唯一外键关联映射_

向.avi

Hibernate_07_oneToone_upk_2

学习内容:

多对一关联映射

一对一主键关联映射_单向

一对一主键关联映射_双向

一对一唯一外键关联映射_单向

一对一唯一外键关联映射_双向

一对一主键关联映射_单向

一对一主键关联映射_双向

一对一唯一外键关联映射_单向

一对一唯一外键关联映射_双向

Hibernate学习笔记3

1.

多对一关联映射

多对一关联映射

关联映射的本质:

*

将关联关系映射到数据库(关联关系:对象模型在内存中的一个或多个引用)

在多的一段的映射文件加入

在"多"的一端加入字段作为外键参照"一"端

重要属性(cascade)级联

*

级联的意思是指定两个而对象之间的操作联动关系,对一个对象执行了操作之后,对其指定的

级联对象也需要执行想同的操作

*

总工可以取值为: all、none、save-update、delete

*all——

代表在所有的情况下都执行级联操作

*none——

在所有的情况下都不执行级联操作

*save-update——

在保存和更新的时候执行级联操作

*delete——

在删除的时候执行级联操作

*

如:

cascade="all"/>

persistent

状态的对象不能引用 transisent状态的对象

testLoad1

查询保存在user_message中的数据信息,以及相关外键的信息

1.

修改原先定义好的User类中id属性类型为int

2.

在User.hbm.xml文件中添加字段,修改生成策略为native

3.

新建Group.java实体类添加字段 id name 以及get和set方法 id类型int name类型String,并且生成相应的配置文件,其中生成策略为native

4.

执行testExport.java

测试类中方法的主要代码片段:

所有测试方法,以及其作用

testManyToOne1 不保存Group对象,会报错

testManyToOne2 保存Group对象,不会报错

testManyToOne3 不保存Group对象,但是设置cascade属性为all,不会报错

testLoad1 查询保存在user_message中的数据信息,以及相关外键的信息

testManyToOne1

Group group = new Group();group.setName( "科学家" );User user = new User();user.setName( "爱因斯坦" );user.setAge( 20 );user.setCreateTime( new Date() );user.setExpireTime( new Date() );user.setGroup( group ); session.save( user );

testManyToone2

Group group = new Group();group.setName( "科学家" );session.save( group );User user = new User();user.setName( "爱因斯坦" );user.setAge( 20 );user.setCreateTime( new Date() );user.setExpireTime( new Date() );user.setGroup( group );session.save( user );

testManyToone3

Group group = new Group();group.setName( "科学家" );User user = new User();user.setName( "爱因斯坦" );user.setAge( 20 );user.setCreateTime( new Date() );user.setExpireTime( new Date() );user.setGroup( group );session.save( user );

testLoad()

测试结果:

Hibernate:

向 user_message中发送查询语句

爱因斯坦

Hibernate:

group_message

表发送查询语句

科学家

User user = ( User )session.get( User.class ,  1 );System.out.println( user.getName() );System.out.println( user.getGroup().getName() );

2.

一对一主键关联映射_单向

一对一关联映射(one-to-one)

*

两个对象之间是一对一的关系,如Person—IdCard

*

有两种策略可以实现一对一的关联映射

*

主键关联:即让两个对象具有相同的主键值, 以表明他们之间的一一对应的关系,

这样可以避免多余的字段被创建; 数据库不会有额外的字段来维护它们之间的关

系,仅通过表的主键来关联

*

唯一外键关联:外键关联,本来是用于多对一的配置,但是如果加上唯一的限制之

后,也可以用来表示一对一关联关系。

单向关联 :只能一端访问另一段。

双向关联 :两端可以进行互相访问。

hibernate_04_oneToone_pk_1

例子

Person

:(int id ),(String name),(IdCard idCard)

IdCard

:(int id ),( String cardNo)

Person

中的id字段作为一个外键参照IdCard中的id字段,

即Persion中的id字段的数据来源于IdCard中的id字段值,共享IdCard的主键

设置Person.hbm.xml生成策略为foreign,加参数idCard

只是Hibernate怎么加载它的关联对象,默认根据主键加载

(外键约束,表名当前主键上存在一个约束,Person

的主键作为外键参照IdCard) >

一对一关联映射中默认了cascade属性

所以不用保存IdCard就能够运行成功。

session.save(person);

执行过该语句后Hibernate发送insert into idCard_message

当提交事务以后Hibernate再发送insert into person_message

session.get(

类名,id值);

通过人来查找身份证号。

测试类,方法的主要代码:

testSave()

Group group = new Group();group.setName( "科学家" );User user = new User();user.setName( "爱因斯坦" );user.setAge( 20 );user.setCreateTime( new Date() );user.setExpireTime( new Date() );user.setGroup( group );

testLoad()

Person person = (Person) session.get( Person.class , 3 );System.out.println( "person.name = " + person.getName() );System.out.println( "person.idCard = " +person.getIdCard().getCardNo());

2.

一对一主键关联映射_双向

Person <----> IdCard

在IdCard端持有person的引用

在IdCard.hbm.xml中加入

指向person 指示Hibernate如何加载person

默认根据加载主键

进行加载的时候,使用IdCard查询Person.name

只发送一条查询语句,fatch默认join,只发送一条外连接

相关主要代码:

testSave

()

添加数据

IdCard idCard = new IdCard();idCard.setCardNo( "1111111" );Person person = new Person();person.setName( "太阳星" );person.setIdCard( idCard );

testLoad1

()

IdCard

-->

Person

进行查询数据

IdCard idCard = (IdCard) session.get( IdCard.class, 1 );System.out.println( "person.name = " + idCard.getPerson().getName() );System.out.println( "person.cardNo" + idCard.getCardNo() );

testLoad2

()

Person

-->

IdCard

进行查询数据

Person person = (Person) session.get( Person.class , 1 );System.out.println( "Person.name = " + person.getName() );System.out.println( "Person.cardNo = " + person.getIdCard().getCardNo() );

3.

一对一唯一外键关联映射——单向

多对一映射的特例

hibernate04_oneToone_upk_1

person_message

与idCard_message 增加字段IdCard,person主键自增

显示多的一端的多重性唯一

相关主要代码:

testeSave()

添加数据

IdCard idCard = new IdCard();idCard.setCardNo( "1111111" );session.save( idCard );Person person = new Person();person.setName( "太阳星" );person.setIdCard( idCard );

testLoad()

Person

-->

IdCard

Person person = (Person) session.get( Person.class , 1 ); System.out.println( "person.name = " + person.getName() );System.out.println( "person.idCard = " + person.getIdCard().getCardNo());

4.

一对一唯一外键关联映射——双向

在idcard中加入字段person

采用one-to-one来进行映射 ,指示hibernate如何加载其关联对象,默认根据主键加载person,因为外键

关联映射中采用,因为两个实体采用的是person的外键进行维护的关系,所以不能指定主键加载person,

而要根据person的外键进行加载,所以设置property-ref属性来指定向哪个字段进行比较

相关主要代码:

testSave

()

添加数据

IdCard idCard = new IdCard();idCard.setCardNo( "1111112" );session.save( idCard );Person person = new Person();person.setName( "太阳星" );person.setIdCard( idCard );

testLoad1

()

IdCard

-->

Person

进行查询数据

IdCard idCard = (IdCard) session.get( IdCard.class , 1 );System.out.println( "person.name = " + idCard.getPerson().getName() );System.out.println( "person.idCard = " + idCard.getCardNo() );

testLoad2

()

Person

-->

IdCard

进行查询数据

Person person = (Person) session.get( Person.class ,  1 ); System.out.println( person.getName() + "   " + person.getIdCard().getCardNo() );

提示:

修改one-to-one中的属性不用重新生成表

修改many-to-one中的属性需要重新生成表

XML

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Docker核心技术之容器详解
下一篇:JWT单点登录(源码学习)
相关文章