Hibernate4



  property-ref:填写的是学生的关联关系,针对一对多的情况,在id端不能配置property-ref  
  并且测试时要先保存学生端,才能进行查询   
参考博客:http://johndoe.iteye.com/blog/1420046

二级hibernate.cfg.xml缓存配置:
<!-- 开启二级缓存 -->
   <property name="hibernate.cache.region.factory_class">
         org.hibernate.cache.ehcache.SingletonEhCacheRegionFactory
   </property>  


hibernate4和hibernate5区别:
 * hibernate4需要的Query接口为:org.hibernate.Query
 * hibernate5需要的Query接口为:org.hibernate.query.Query;
 * load和get需要强转
 * 查询多条记录的时候;需要使用:query.list()
 * hql查询单条时:Hibernate4:query.uniqueResult;Hibernate5:query.getSingleResult();

MySQL安装路径:C:\Program Files (x86)\MySQL\MySQL Server 5.5
修改默认mysql编码:
    my.ini文件:default-character-set=utf8 和 character-set-server=utf8
    cmd 关闭mysql服务:  net stop mysql
            启动mysql服务:net start mysql
1.持久化:加载:hibernate里,数据从数据库中加载到session
2.Hibernate(针对关系型数据库):是一个orm的轻量级框架,解决持久化操作,使得程序员可以从编写繁复的jdbc工作中解放出来,专注于业务,
   以面向对象的方式处理关系,提供了缓存,提高开发效率。ORM:对象关系映射
   阻抗不匹配:对象和关系数据库不匹配
   没有侵入性:在代码中不用去继承hibernate类或hibernate提供的接口

3.类库文件:D:\MainSoftWare\hibernate4.3\hibernate-release-4.3.5.Final\lib\required
   将D:\MainSoftWare\hibernate4.3\hibernate-release-4.3.5.Final\project\etc\hibernate.cfg.xml放到src目录
   在目录下有hibernate.properties存放各大数据库的连接信息
hibernate.cfg.xml配置信息:
<hibernate-configuration>
    <session-factory >
        <!-- 配置数据库信息 -->
        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="connection.url">jdbc:mysql://localhost:3306/mydb</property>
        <property name="connection.username">root</property>
        <property name="connection.password">root</property>
        <property name="dialect">org.hibernate.dialect.MySQL5Dialect</property>
    </session-factory>
</hibernate-configuration>  

4.hibernate测试流程:
    //1.新建Configuration
    //2.通过Configureation创建SessionFactory对象
    //3.得到SessionFactory得到Session
    //4.通过Session对象得到Transaction对象
    //5.保存数据
    //6.提交事务
    //7.关闭session等
   修改主键自动增长:alter table customers change id id int not null auto_increment primary key;
1.创建与数据库对应的javabean
  public class UserInfo{      
    private int uid;        //必须字段与数据库的字段一一对应,名字类型要一致
    private String uname;
    private String upwd;  
2.在javabean对应的包下创建  UserInfo.hbm.xml配置与数据表对应的信息
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
     "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
     "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
<hibernate-mapping >
    <class name="com.bean.UserInfo" table="news">
      <id name="uid">
        <generator class="native"></generator> <!-- 主键生成策略 native自动增长 -->
      </id>
          <property name="uname" column="uname"></property>
          <property name="upwd" column="upwd"></property>
    </class>
</hibernate-mapping> 
3.配置hibernate.cfg.xml文件
         <property name="connection.url">jdbc:mysql://mydb</property>相当于
         <property name="connection.url"> jdbc:mysql://localhost:3306/mydb</property>
        
         <proterty name="format_sql">true</property>         //格式化控制台显示的sql
         <proterty name="hbm2ddl.auto">create</property>    //数据库更新方式,
              create:每次执行先把原有数据表删除,然后创建该表,再进行crud操作
              create-drop:会显式关闭SessionFactory,drop掉数据库schema(表)
              validate:检测
              update:如果表不存在则创建,有则不创建(一般设置为update)
              
4.写测试类
        Configuration conf=new Configuration().configure();        //configure()默认读取src下的hibernate.cfg.xml文件,
                                                                                                               //以读取自定义文件configure("hhh.cfg.xml")
        ServiceRegistry sr=new StandardServiceRegistryBuilder().applySettings(conf.getProperties()).build();
        SessionFactory sf=conf.buildSessionFactory(sr);       
        Session session=sf.openSession();        //3.得到SessionFactory得到Session
        Transaction transaction=session.beginTransaction();        //4.通过Session对象得到Transaction对象
        UserInfo ui=new UserInfo();         //5.保存数据
        ui.setUname("kkk");
        ui.setUpwd("ss");
        session.save(ui);                            //推荐加session.flush(); 
      UserInfo u=(UserInfo) session.get(UserInfo.class, 1);    //查询数据    1代表第一个记录相当于getByid
             System.out.println("uname:"+u.getUname());
        transaction.commit();         //6.提交事务
        session.close();        //7.关闭session等

5.a) 通过ServiceRegistry实例创建SessionFactory实例,一个应用中最好也是单例的,线程安全,属于进程级别的对象。
   b)Session对象:使用Hibernate进行数据库操作,主要使用session。Session可以理解为Connection对象的一个包装。
      Session对象中提供了数据库的crud操作。Session是一个线程不安全的对象,生命周期非常短暂,一般和事务一一对应。

6.Transaction对象:事务管理对象,通过session来获取该对象,能进行事务的开启、提交和回滚。
   两种方式开启事务:
   a)  Transaction tx=session.beginTransaction();
   b)  Transaction tran=session.getTransaction();
         tran.begin();

7.日志:
   a)确定要使用日志的实现log4j
   b)slf4j-api-1.7.12.jar和log4j.jar放入classpath
   c)编写log4j.properties,放在src目录下
  
9.Hbm.xml详解:
  a) pojo类:1.提供公共的无参构造方法,通过反射产生对象
                      2.属性用private修饰,并且生成get和set方法
                      3.类不能用final修饰---hibernate会产生代理类(cglib)
                      4.类需要指明标识,hbm.xml指明<id name="id"  column="id">    name对应数据库表中的主键  
                         column表示对应数据库表的列名,如果不写则数据库表中列名和属性名一致
                      5.<property name="user"/>   user区分大小写
                        

10.根据主键加载持久化实体
  session.load(User.class,pk)
 session.get(User.class,7);            
  get和load 区别:get/load都会去立即查询对象;get找不到对象时,返回null;load则会抛出异常
            clear:清除session缓存中所有对象   evict: 清除指定对象
  session.delete(user);     //手动构造一个对象,指定主键是可以删除(更新也是)对象,但不推荐    
  User user=(User)session.get(User.class,3);      //应使用此形式删除,可以避免null异常;load类似
  if(user!=null){
       session.delete(user);             
   }
  对象声明周期:
        
11.使用SchemaExport
     Configuration cfg=new Configuration.configure();
     SchemaExport se=new SchemaExport(cfg);
     se.create(true,true);     //第一个参数是否生成ddl脚本,第二个参数  是否执行到数据库中

12.组合主键
    1.编写组合主键的类,该类必须实现Serializable接口,最好实现equals()和hashcode()
    2.在主类中引用组合主键;socreId是组合主键;stuId是主类主键
      

13.大对象处理
     java.sql.Blob和java.Clob存储可达4G
     <property name="image" type="java.sql.Blob"/>
     操作大数据对象:
     Blob blob=new SerialBlob("ttt".getBytes());
     Clob clob=new SerialClob("sss".toCharArray());

14.组件映射
     组件:是一个被包含的对象,在持久化的过程中,被当做值类型,而并非一个实体的引用
         <id name="id">
           <generator class="native"/>
        </id>
       <component name="addr" class="Address">                 //Address作为Teacher的成员,只生成一张表
            <property name="addr1"/>
      </component>  

15.多对一
    Student对应Grade,Student中存放grade对象
    grade外键表的对象作为Student主表的成员,表各自定一张hbm.xml,然后通过以下映射多对一外键关系
   <!-- 多对一 name表示属性名  class属性对应的类  column数据库表中的列名 -->
   <many-to-one name="grade" class="Grade" column="grade_id" foreign-key="fk_grade" not-null="true"/>

16.一对多
    使用HibernateUtil时需要改成<property name="connection.url">jdbc:mysql:///hibernatedb</property>
    grade中存放Student对象,形成一对多
    Grade中写:    private Set<Student> students=new HashSet<Student>(0);
   <set name="students">
          <key column="grade_id"  not-null="true"/>   指明外键列名,保存数据顺序根据外键决定,如果外键为not-null,则先保存一的一端
                                                                                              如果外键可以为null,则可以随意保存
          <one-to-many  class="Student"/>
    </set>
   grade.getStudents().add(s);    //保存数据的顺序 是根据外键的配置来决定的                   
   session.save(grade);                 //如果外键不能为null,那么先保存一的一端
   session.save(s);                          //如果外键可以为null,则可以随意保存


4.操作hibernate流程:
   1.开发持久化类,由POJO+持久化注解组成
   2.获取Configuration
   3.获取SessionFactory
   4.获取Session,打开事务
   5.用面向对象的方式操作数据库
   6.关闭事务,关闭session
PO与session关联关系:
  瞬态:PO实例(new Java实例)从未与Session关联过
  持久化:PO实例与Session关联过,且改实例对应到数据库记录
  脱管:PO实例曾与Session关联过,但因为Session的关闭等原因,PO脱离了Session的管理

         http://blog.csdn.net/zys_hh/article/details/20721261

6.Hibernate.cache.use_second_level_cache:是否设置二级缓存
  hibernate持久化类要求:
   1.提供一个无参数的构造器
   2.提供一个标识的属性(映射到数据库表的主键)

7.持久化实体:
  1.Serializable save(Object obj):将obj对象变为持久化对象,该对象的属性将被保存到数据库;返回记录值的主键
  2.void persist(Object obj):将obj转为持久化状态;无任何返回
  3.Serializable save(Object obj,Object pk)指定主键保存
  4.void persist(Object obj,Object pk)









posted on 2018-03-06 18:05  xiaojiayu0011  阅读(156)  评论(0)    收藏  举报

导航