初识Hibernate——超简单双向级联操作

来源:互联网 发布:linux jdk gz 安装 编辑:程序博客网 时间:2024/06/16 07:42

工欲善其身必先利其器,在使用Hibernate之前做好准备工作

首先我们准备好数据源,一张班级表和一张学生表,班级对学生是一对多的,学生对班级是多对一的

再此已oracle数据库为例:

//创建用户create user xiaoping identified by "123"; //授权 grant connect,resource,dba to xiaoping;  //切换到xiaoping用户conn xiaoping/123;//创建表create table grade(gid integer primary key,gname varchar2(50) not null);create table student(sid integer primary key,sname varchar2(20) not null,sex varchar2(2) ,gid integer not null);//建立外键关系alter table student add foreign key(gid) references grade (gid);

创建好数据库之后我们使用MyEclipse工具来添加关联映射关系

右键MyEclipse->Add Hibernate Capabilities...然后根据向导完成(此处省略上万字。。。)

然后我们可以在MyEclipse 的DB Browser视图下去右键创建数据库的连接,同样也是向导方式完成,这里附上常见数据库jdbc连接url

SQL Server 2005:jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=数据库名称

SQL Server 2008:jdbc:sqlserver://localhost:1433;databaseName=数据库名称

MYSQL:jdbc:mysql://localhost:3306/数据库名称

Oracle(thin模式):jdbc:oracle:thin:@loaclhost:1521:数据库名称

DB2:jdbc:db2://localhost:5000/数据库名称


最后我们可以在数据库视图里面找到前面创建的表右键生成实体和映射文件
在生成的hibernate.cfg.xml中我们还可以加上一些常用配置项
<property name="show_sql">true</property>
<property name="hbm2ddl.auto">update</property>

在去体验Hibernate级联操作之前我们不妨来了解一下Hibernate的执行流程


看完这张图思路就很清晰了,我们来看代码

public static void main(String[] args) {//加载配置文件Configuration cfg = new Configuration().configure();//获取会话工厂对象SessionFactory sessionFactory = cfg.buildSessionFactory();//通过会话工厂拿到一个会话,这个session可以看做是jdbc中Connection的作用Session session = sessionFactory.openSession();//开始一个事务Transaction transaction = session.beginTransaction();Grade g = new Grade();g.setGname("Class A");g.getStudents().add(new Student("张三丰"));//这里的保存班级对象的同时会将班级中的学生保存到session.save(g);//提交事务并关闭会话transaction.commit();session.close();}

届时,我们来看控制台


可以看到我们在save班级的同时也会保存班级中的学生

我们在配置级联关系时,如班级配置文件Grade.hbm.xml中会有一个学生的集合

在set标签中配置,其中有两个属性较为常用和关键(inverse & cascade)



 Inverse:负责控制关系,默认为false,也就是关系的两端都能控制,但这样会造成一些问题,更新的时候会因为两端都控制关系,于是重复更新。为了程序的效率有一端要设为true。

Cascade:负责控制关联对象的级联操作,包括更新、删除等,也就是说对一个对象进行更新、删除时,其它对象也受影响,比如我删除一个对象,那么跟它是多对一关系的对象也全部被删除。

举例说明区别:删除“一”那一端一个对象O的时候,如果“多”的那一端的Inverse设为true,则把“多”的那一端所有与O相关联的对象外键清空;如果“多”的那一端的Cascade设为Delete,则把“多”的那一端所有与O相关联的对象全部删除。

最后附上一张图描述在Hibernate中对象在三种状态中的转换



0 0
原创粉丝点击