今天上午从10:00开始学习:
1.映射文件是hibernate运行时非常重要的一个文件,因为把对象模型和关系联合起来的就是它。
里面有:
<class name="User" table="user">
//这个代码的意思呢,就是,把这个类User和表user对应起来。
其实这个表,我们可以不写,缺省的是类名和表名是一样的。
下面呢,就是这个类属性的一些标签。
<id name="id"> //这个ID映射的是一个主键名。Name是java的一个属性名
<generator class="native"/>
</id>
2.那么我们再来看看这个id的值是怎么产生的?
这个主键的产生方式有很多种,那么我们用的是那种方式呢?我们要告诉它。
<generator class="native"/>对应的是主键生成器,那么native只是其中的一种。
其实这个id是有值的,我们可以这样做。在Base.java中,输入这样一个代码:
System.out.println("id:"+user.getId( ));
那么在myeclipse上就打印出了:id:1
然后下面就跟着两个属性!!!
3.下面呢,我们来看看这个java代码:Base.java
Configuration cfg=new Configuration();
cfg.configure();
SessionFactroy sf=cfg.bulidSessionFactroy();
//这个过程是hibernate初始化的一个过程
这个过程在我们的程序里面只做一次
Hibernate是通过一个工具类来完成的,这个工具类是不能被其它的东西改写的,所以申明为final
HibernateUtil.java:
在这个类里面,我们禁止new多个实例,也就是说new多个实例也是没有用的,这个过程在我们的程序里面只需要做一次。
4.我们想让:Configuration cfg=new Configuration();
cfg.configure();
SessionFactroy sf=cfg.bulidSessionFactroy();
这段代码只做一次,那么可以将这段代码挪到这个工具类里面来。
用static代码块。
package cn.itcast.hibernate;
import com.opensymphony.xwork2.config.Configuration;
public final class HibernateUtil {
//我们用私有的缺省的构造方法,别人既不能去继承它,也不能是实例化它
private HibernateUtil()
{
}
//那么我们怎么去用它呢?可以将其设计成单例,也就是一种设计模式
static{
Configuration cfg=new Configuration();
cfg.configure();
SessionFactroy sf=cfg.bulidSessionFactroy();
}
}
上面就可以保证这段代码只执行一次
package cn.itcast.hibernate;
import org.hibernate.SessionFactory;
import com.opensymphony.xwork2.config.Configuration;
public final class HibernateUtil {
private static SessionFactory sessionFactory;
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
//我们用私有的构造方法,别人既不能去继承它,也不能是实例化它
private HibernateUtil()
{
}
//那么我们怎么去用它呢?可以将其设计成单例,也就是一种设计模式
static{
Configuration cfg=new Configuration();
cfg.configure();
sessionFactory=cfg.bulidSessionFactroy();
}
}
5.那么我们现在来看一下这个初始化过程:
Configuration会读取这个配置文件,也就是hibernate.hbm.xml文件,它会从这个classpath中读取。
其实在我们工程下面的src目录下也可以找到这个文件,那么这是为什么呢?这是因为,这个src目录运行的时候,最终会被注入到这个classpath当中去。
bulidSessionFactroy()是得到这个sessionfactory对象
而sessionfactory相当于JDBC里面的javamanage对象,可以获取链接。
我们在里面可以再建立一个session方法:
static{
Configuration cfg=new Configuration();
cfg.configure();
sessionFactory=cfg.bulidSessionFactroy();
}
public static Session getSession()
{
return sessionFactory.openSession();
}
}
注意,这里的session是org.hibernate.Session包里面的
通过这个HibernateUtil工具类呢,就把我们的hibernate初始化工作包装起来了。
在写代码的时候,就可以通过这个工具类来获取这个session。
那么现在就可以把Base里面的这段代码修改一下:
package cn.itcast.hibernate;
import java.sql.Date;
import org.hibernate.Transaction;
import org.hibernate.classic.Session;
import cn.itcast.hibernate.docmain.User;
public class Base {
public static void main(String[] args) {
Session s=HibernateUtil.getSession();
Transaction tx=s.beginTransaction();
User user=new User();
user.setName("name");
user.setBirthday(new Date(0));
s.save(user);
s.close();
System.out.println("end");
}
}
6.其实上面的测试代码有写的不是很规范,就是没有抛掷异常,那么我们应该怎么做呢?
可以来参照一个模板:
static void addUser(User user)
{
Session s=null;
Transaction tx=null;
try{
s=Hibernate.Util.getSession();//先获取session
tx=s.beginTransaction();//再通过session对象获取事务
s.save(user);
tx.commit();
}
Catch(HibernateException e)
{
if(tx!=null)
{
Tx.rollback();
Throw e;
}
Finally{
if(s!=null)
{
S.close();
}
}
}
那么上面这段代码是hibernate里面比较规范的一段代码。
OK,那么今天上午学习了1小时26分钟