hibernate的API、映射关系----(一对一,一对多,多对多)等映射关系 -----学习之二
一、API:
hibernate的发布包-----documentation---javadocs---index.html就可以打开hibernate的
API
//1、创建配置文件
//2、配置文件的加载(读取配置文件)---目的建立与数据库的连接。
//3、根据配置文件信息创建一级缓存(是一种重量级的而对象),也就是说
一个项目建立一个对象就可以了,不能平凡的创建与销毁。
在这个步骤下会创建一个映射对象(类与表的映射关系)。所以不能平凡的创建与销毁。
HttpSession:用户与浏览器之间的对话,web端
Session::代码与数据库之间的对话,dao层(端)
//4、创建Session,打开会话
//5、开启事物(每一个事物,应该对应着一个事物的提交或回滚,每一个会话可以包
含多个事物,当然事物还可以回滚,回滚到上一个事物提交点,当然一个事物还可以提交一个
会话的多个内容)。
//6、事物的提交
//7、Session的关闭
例子:
Session 打电话---开始会话
Transation1
begin-1
买房
commit-1
Transation2
begin-2
买车
commit-2
Transation3
begin-3
美女
RollBack-3 ----回滚到commit-2那里了。
Session.close()---关闭会话。
//然后说回来
想要知道我么那天讲什么了---聊了房子--车子---但忘了聊美女---因为美女已经回滚。
MySQL数据库的操作的保存是自动的提交的,但在终端中oracle的提交的手动提交的,所以在这里
讨论事物的问题“就用oracle数据库来说明”。
一次会话的开启-----代表的是一个事物的开启。
执行的sql语句,如果没有提交----那么sql语句只是将数据缓存到数据库的缓冲区中-----
但没有真正的插入、更新、或删除数据表中的数据。----比如回滚(rollBack)----那么就可
以将数据库中的缓冲区中的数据清空了该事物所对应的缓冲区数据。-----再怎么提交也没有
用了。
数据库
oracle(事物的管理)
Session 事物的开启 事物的提交 事物的关闭。
db 数据库的连接 会话的开启/ commit rollBack
上一个事物的
提交或者回滚。
(意味着下一个事物的
开始)
jdbc Connection 数据库的连接 是自动管理 conn.rollBack()//保存回滚点
事物的(
conn.setAutoCommit(true);
//设置事物是自动提交的
//默认参数是true所以是自动
提交的。
//还可以conn.commit()
//还可以conn.rollBack()
)
Hibernate Session 会话的开启 transaction.commit() transaction.rollBack();
上一个事物的
提交或者回滚。
用jdbc就不要用Hibernate,用Hibernate就不要用jdbc。
Hibernate的封装---代码的抽取。----》
session.save();
session.createQuery();
session.load();
session.delete();
session.update();
从这里就可以看出数据的操作离不开Session,所以我们要封装的是一个Session的工厂。
后期的使用我们可以不要去封装----因为已经有人给我们封装好了-----但我们要清楚它
的原理。
Session的工厂类如下:
HibernateSessionFactory{
private static SessionFactory factory;
//只有在当前线程下才能取得该session对象。
//线程的安全,用于存放session,该对象是线程安全的,只有当前线程才能访问。
private static ThreadLocal<Session> threadLocal;
static{
Configuration config=new Configuration();
config.configure();
factory.config.builSessionFactory();
threadLocal=new ThreadLocal<Session>();
}
//可能不知道要关闭那个Session中的事物。
public Session getSession(){
Session session=threadLocal.get();//每次获取session的时候都从ThreadLocal包
//中获取,如果当前的线程中该包为空,则执行if()中的代码,或者当前的线程有
//session,但session被关闭掉
if(session==null || !session.isOpen()){// "||"是一个短路的运算符,当
//前一个成立,“||”后面的判断条件就不用执行了。
session.factory.openSession();
threadLoal.set(session);//threadLocal就是一个包。用的时候就取,不用的时候放进去。
}
return session;
}
}
//可能不知道要关闭那个Session中的事物。如下解析:
dao:
Session session=session.getSession();
Transation tran=session.openTransation();
tran.save();
tran.commit();
session.close();
service:
//转账
transfer(){
Session session =getSession();//该session和dao层中的session必须是同一个
//session。如果不一样,就会引发问题:
//service中的sessionA,dao层中的sessionB,比如在service中做一个update操作
//然后在dao层中提交,那 么执行的代码---sessionA.update()-----sessionB.commit()
//最后sessionA并没提交。而没做操作的sessionB却提交了。那么sessionA的操作就没
//作用。
Transaction tran=session.begin();
dao.updateAccout(1000,alse,A);
//判断对方的账号
dao.updateAccout(1000,true,B);
}
//所以现在的企业中将事物放在service层来管理,就是说在dao层没有事物的身影了。就是
//在dao层就不要出现事物了。//service拿session的目的是做事物的管理的,不做增、删
//改、查,而做增、删、改、查的是:dao层。
//为了不引发问题、至少保证同一个线程中的dao层的session与service的session是同一个session。
测试的例子:
dao层:
public class UserDao{
private Session getSession(){
return HibernateSessionFactory.getSession();
}
public void save(User user){
getSession.save(user);
}
public void deleteById(long id){
Session session=getSession();
User user=(User)session.getload(User.class,id);
session.delete(user);
}
}
//以后测试的时候不要直接测试dao层,因为dao层没有做事物的管理,也就是说dao层必须
//配合service层来使用。service层才是事物的管理。也就是说如果直接测试dao层数据是没有任
//何的改变的。
service层中的代码:
public class UserService{
public UserDao userDao=new UserDao();
public void register(User user){
Session session=HibernateSessionFactory.getSession();
Transaction tran=session.beginTransaction();
userDao.save(user);
tran.commit();//提交dao层和service层中同一个session会话内容的事物。
session.close();
//事物的提价,和关闭,这不能再封装了,因为dao层没事事物的管理。而每一次做业务
//的处理的时候都会调用dao层中的方法,而dao层中的方法一般都是做数据的增、删、
一、API:
hibernate的发布包-----documentation---javadocs---index.html就可以打开hibernate的
API
//1、创建配置文件
//2、配置文件的加载(读取配置文件)---目的建立与数据库的连接。
//3、根据配置文件信息创建一级缓存(是一种重量级的而对象),也就是说
一个项目建立一个对象就可以了,不能平凡的创建与销毁。
在这个步骤下会创建一个映射对象(类与表的映射关系)。所以不能平凡的创建与销毁。
HttpSession:用户与浏览器之间的对话,web端
Session::代码与数据库之间的对话,dao层(端)
//4、创建Session,打开会话
//5、开启事物(每一个事物,应该对应着一个事物的提交或回滚,每一个会话可以包
含多个事物,当然事物还可以回滚,回滚到上一个事物提交点,当然一个事物还可以提交一个
会话的多个内容)。
//6、事物的提交
//7、Session的关闭
例子:
Session 打电话---开始会话
Transation1
begin-1
买房
commit-1
Transation2
begin-2
买车
commit-2
Transation3
begin-3
美女
RollBack-3 ----回滚到commit-2那里了。
Session.close()---关闭会话。
//然后说回来
想要知道我么那天讲什么了---聊了房子--车子---但忘了聊美女---因为美女已经回滚。
MySQL数据库的操作的保存是自动的提交的,但在终端中oracle的提交的手动提交的,所以在这里
讨论事物的问题“就用oracle数据库来说明”。
一次会话的开启-----代表的是一个事物的开启。
执行的sql语句,如果没有提交----那么sql语句只是将数据缓存到数据库的缓冲区中-----
但没有真正的插入、更新、或删除数据表中的数据。----比如回滚(rollBack)----那么就可
以将数据库中的缓冲区中的数据清空了该事物所对应的缓冲区数据。-----再怎么提交也没有
用了。
数据库
oracle(事物的管理)
Session 事物的开启 事物的提交 事物的关闭。
db 数据库的连接 会话的开启/ commit rollBack
上一个事物的
提交或者回滚。
(意味着下一个事物的
开始)
jdbc Connection 数据库的连接 是自动管理 conn.rollBack()//保存回滚点
事物的(
conn.setAutoCommit(true);
//设置事物是自动提交的
//默认参数是true所以是自动
提交的。
//还可以conn.commit()
//还可以conn.rollBack()
)
Hibernate Session 会话的开启 transaction.commit() transaction.rollBack();
上一个事物的
提交或者回滚。
用jdbc就不要用Hibernate,用Hibernate就不要用jdbc。
Hibernate的封装---代码的抽取。----》
session.save();
session.createQuery();
session.load();
session.delete();
session.update();
从这里就可以看出数据的操作离不开Session,所以我们要封装的是一个Session的工厂。
后期的使用我们可以不要去封装----因为已经有人给我们封装好了-----但我们要清楚它
的原理。
Session的工厂类如下:
HibernateSessionFactory{
private static SessionFactory factory;
//只有在当前线程下才能取得该session对象。
//线程的安全,用于存放session,该对象是线程安全的,只有当前线程才能访问。
private static ThreadLocal<Session> threadLocal;
static{
Configuration config=new Configuration();
config.configure();
factory.config.builSessionFactory();
threadLocal=new ThreadLocal<Session>();
}
//可能不知道要关闭那个Session中的事物。
public Session getSession(){
Session session=threadLocal.get();//每次获取session的时候都从ThreadLocal包
//中获取,如果当前的线程中该包为空,则执行if()中的代码,或者当前的线程有
//session,但session被关闭掉
if(session==null || !session.isOpen()){// "||"是一个短路的运算符,当
//前一个成立,“||”后面的判断条件就不用执行了。
session.factory.openSession();
threadLoal.set(session);//threadLocal就是一个包。用的时候就取,不用的时候放进去。
}
return session;
}
}
//可能不知道要关闭那个Session中的事物。如下解析:
dao:
Session session=session.getSession();
Transation tran=session.openTransation();
tran.save();
tran.commit();
session.close();
service:
//转账
transfer(){
Session session =getSession();//该session和dao层中的session必须是同一个
//session。如果不一样,就会引发问题:
//service中的sessionA,dao层中的sessionB,比如在service中做一个update操作
//然后在dao层中提交,那 么执行的代码---sessionA.update()-----sessionB.commit()
//最后sessionA并没提交。而没做操作的sessionB却提交了。那么sessionA的操作就没
//作用。
Transaction tran=session.begin();
dao.updateAccout(1000,alse,A);
//判断对方的账号
dao.updateAccout(1000,true,B);
}
//所以现在的企业中将事物放在service层来管理,就是说在dao层没有事物的身影了。就是
//在dao层就不要出现事物了。//service拿session的目的是做事物的管理的,不做增、删
//改、查,而做增、删、改、查的是:dao层。
//为了不引发问题、至少保证同一个线程中的dao层的session与service的session是同一个session。
测试的例子:
dao层:
public class UserDao{
private Session getSession(){
return HibernateSessionFactory.getSession();
}
public void save(User user){
getSession.save(user);
}
public void deleteById(long id){
Session session=getSession();
User user=(User)session.getload(User.class,id);
session.delete(user);
}
}
//以后测试的时候不要直接测试dao层,因为dao层没有做事物的管理,也就是说dao层必须
//配合service层来使用。service层才是事物的管理。也就是说如果直接测试dao层数据是没有任
//何的改变的。
service层中的代码:
public class UserService{
public UserDao userDao=new UserDao();
public void register(User user){
Session session=HibernateSessionFactory.getSession();
Transaction tran=session.beginTransaction();
userDao.save(user);
tran.commit();//提交dao层和service层中同一个session会话内容的事物。
session.close();
}
public void register(User user){
Session session=HibernateSessionFactory.getSession();
Transaction tran=session.beginTransaction();
userDao.update(user);
tran.commit();//提交dao层和service层中同一个session会话内容的事物。
session.close();
}
//事物的提价,和关闭,这不能再封装了,因为dao层没事事物的管理。而每一次做业务
//的处理的时候都会调用dao层中的方法,而dao层中的方法一般都是做数据的增、删、
//改、查操作。
//当然后期还有解决的办法,就是spring技术,面向切面的编程。
}
Test类(测试类):
public class Test{
public void static nain(String[] args){
UserService userService =new UserService();
userService.register(new User("fu",23));
}
}
//如果测试的时候,数据库中没有数据的任何效果-----那要看可能是你的事物的管理是问题了。