工欲善其身必先利其器,在使用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/数据库名称
<property name="hbm2ddl.auto">update</property>
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中对象在三种状态中的转换