• 欢迎访问ByWei.Cn,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站,加入百味博客 QQ群
  • 已升级为最新版主题,并将持续优化改造中,支持说说碎语功能,可像添加文章一样直接添加说说,博客主题升级啦
  • 感谢您百度求点赞啊!百度网址
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏百味博客吧
  • 博主热烈欢迎 软件定制开发 联系:http://www.bywei.cn

Hibernate完全学习文档(ssh框架)

企业架构 bywei 9年前 (2011-03-30) 963次浏览 0个评论 扫描二维码

1.Hibernate 引用 jar 文件,建立 hibernate.cfg.xml,并配置好改文件.
2.方言:<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
3.使用 xml 建立 Hello world!
(1)xml 配置映射实体类:(Class.hbm.xml)
  <class name="Class">
    <id name="id"></id>  <!–主键–>
    <property name="age"></property> <!–属性–>
  </class>
(2)在 hibernate.cfg.xml 中配置:<mapping resource="cn/bywei/model/Class.hbm.xml"/>
(3)使用 Session
   Configuration cfg=new Configuration();
   SessionFactory cf=cfg.configure().buildSessionFactory();
   Session session=sf.openSession();
   session.beginTransaction();  
   session.save(model);
   session.getTransaction().commit();
   session.close();
   sf.close();

4.使用 Annotation 建立 HelloWorld!
jpa:javax.persistence.Entity;(JPA 是一套非常好的标准)
(1)建立一个 Model 类,使用注解 @Entity 标识实体类   @Id 标识主键 @GenertedValue 标识自动增长列
(2)在 hibernate.cfg.xml 中配置:<mapping resource="cn.bywei.model.Class"/>
(3)使用 Session:
  Configuration cfg=new AnnotationConfiguration();
  SessionFactory sf=cfg.configure().buildSessionFactory();
  Session session=sf.openSession();
  session.beginTransaction();
  session.save(Model);
  session.getTransaction().commit();
  session.close();
  sf.close();
———小技巧———-
1.使用注解@提示:设置 content Assist

————————-
5.O/R Mapping 面对对象的操作

Hibernate.cfg.xml 基础配置
1.<property name="hbm2ddl.auto" >create/update/create-drop/validate</property>自动创建表
2.显示 sql 语句<property name="show_sql">true</property>
3.格式化 sql 语句<property name="format_sql">true</property>
———小技巧———-
1.搭建日志环境 slfj logfj
2.搭建测试环境 @Test 标识测试方法 @BeforeClass 执行前调用的方法@AfterClass
————————-
4.Annotation:在 Model 中指定实体类所对应的数据库 Table:@Table(name="tableName")
  Xml:<class name="table" table=""…….
5.字段名和属性名不同时:Annotation:@Column(name="columnName")
6.指定不可存储到数据库中的属性:Aannotation:@Transient
7.格式化日期精度 @Temporal(TemporalType.DATE) 可以把日期或者日期和时间存储到数据库中
8.映射枚举类型:
  public enum Title{
     A,B,C
  }
  private Title title;

  @Enumerated(EnumType,STRING)    //枚举
  public Title getTitle(){
     ******
  }
9.ID 的生成策略
  xml:<id name="id">
          <generator class="uuid"></generator>  //class=uuid 标识 字符 native 设置(sqlserver)自动增长列,squence (Oracle 中标识列),auto_increamt(mysql)

      </id>
  Annotation:@generatedValue auto(相当于 xml 中的 active)
             当不使用 Oracle 时,可以设置@GeneratedValue(startegy=GenerationType.IDENTITY)  设置 id 的生成策略(sqlerver,mysql)
  @sequenceGenerator(name="标识名字",sequenceName="数据库中的 sequence 名字") 指定 Oracle 生成的 sequence 名字
  @TableGenerator 生成主键策略
  @TableGenerator(
   name="",
   table="GENERATOR_TABLE",
   pkColumnName="key",
   valueColumnNamne="",
   pkClumnValue="",
   allocationSize=1
  )
10.联合主键(id,name)作为联合主键
   在类中:
   public class pk implements Serializable{
     private int id;
     private String name;
   }
   //@Override equals 和 hashcode
   //关系到虚拟内存所以需要序列化
   //为了判断 id 和 name 和传递过来的是相等的,所以需要@Override equals
   public class lianhe{
     private pk pk;
   }
(1)xml 中配置:
   <composite-id name="pk" class="****">
       <key-property name=""/>
       <key-property name=""/>
   </composite-id>
(2)Annotation 的配置:
  -把主键类(pk)注解为@Embeddable,并且把主键的属性注解为@Id
    -把主键的属性注解为@EmbeddedId  表示嵌入的主键 id
    -直接在 Entity 上注解@IdClass(PK.class) 并在主键 id,name 上注解@Id

核心开发接口
1.读取配置:
  SessionFactory sf=new AnnotationConfiguration().configure("hibernate.cfg.xml").buildSessionFactory();
  Session session=sf.getCurrentSession(); //从上下文(在配置文件中设置 current_session_context_class–取值:jta,thread,managed,custom.Class)查找,如果有就获取 Session,没有就创建新的 Session.
  //-用于事务的边界  -事务提交时自动 Close
  //Session session=sf.openSession();//永远是创建一个新 Session
  session.beginTransaction();
  session.save(Entity);
  session.getTransaction().commit();
2.对象的三种状态
  (1)Transient  刚刚 new 出来,内存中有对象,但无 id
  (2)Persistent  内存中有 id,在于 Session 中,数据库中也存在 id
  (3)Detached   Session 已经 Close 没有了 Id,数据库中存在 id
3.Hibernate 的 CRUD
  (1)save()  对象的三种状态
  (2)delete()
  (3)load() 和 get() 
     -load() 生成一个对象代理,需要用到的时候才会调用,
     -get() 直接读取数据
  (4)update()  //设置部分字段不更新@Column(updatable=false)
  (5)saveOrUpdate()
  (6)clear() 清除 Session
  (7)flush() 让缓存与数据同步  session.setFlushMode(FlushMode.COMMIT)设置 flush 的同步时间
4.自动建表
  (1)使用 hibernate.cfg.xml 中的配置自动建表
  (2)使用程序控制:new SchemaExport(new AnnotationConfiguration().configure()).create(显示 sql-true/false,是否执行到数据库-true/false);

关系映射:
1.一对一
  a)单向 一对一单向外键关联:在一方设置另一方的引用(数据库表中设置为外键关联)
         Annotation: 在引用上注解:@OneToOne  @JoinColumn(name="pk_id")设置引用的外键 id 名称
         xml:<many-to-one name=""  column="" unique="true"/>
         一对一单向主键关联:
         Annotation:在引用上设置@PramaryKeyJoinColumn(hibernate3.2 好像有点小 bug)
         xml:****
  b)双向 一对一双向外键关联:在两方都有对方的引用,双方都设置:@OneToOn
e,其中一方还需设置@OneToOne(mappedBy="另一方的引用名称")
         一对一双向主键关联:@OneToOne @PrimaryKeyJoinColumn
         xml:****
  c)联合主键:@JoinColumns
  d)组件映射:在数据库中配置为一张表,把一方设置为另一方的一部分,在引用上设置:@Embedded (表示作为这张表的一部分嵌入到)
2.一对多 多对一
  a)多对一的单向:
    Annotation:多指向一(@ManyToOne)
    xml:<many-to-one name="属性名" column="生成的外键关系名"/>
  b)多对一的双向:
    Annotation:在多指向一设置@ManyToOne,在一指向多设置@OneToMany(mappedBy="多的一方的关系名称")
    xml:一<one-to-many class="" column="和多的一致"/> 多<many-to-one name="" column="和一的一致"/>
3.多对多
  a)多对多的单向关联
    private Set<**> **=new HashSet<**>();//设置对方的引用
    Annotation:一方@ManyToMany  @JoinTable(name="中间表名",joinColumns={@JoinColumn(name="对应自己的表的关系名称")}inverseJoinColumns={,@JoinColumn(name="另外一张表的关系名称")}) 
    xml:一方
        <set name="属性名" table="数据库中间表名" >
            <key column="指向自己的表的关系名"/>
        <many-to-many class="" column="指向另外一张表的关系名"/>
        </set>
  b)多对多的双向关联
    private Set<**> **=new HashSet<**>();
    //做好单向关联后
    Annotation:使用注解@ManyToMany(mapedBy="另外一类(多)中的引用名称")
    xml:在另一方设置<many-to-many class="" column=""/>

4.关联关系中的 CRUD
(1)保存时注意关联
   使用 Annotation 设置级联操作:在指向另一类的@关系上设置(cascade={casadeType.ALL})//表示对所有的 CRUD 都进行级联操作
   在双向关系中需要设置好双向关联
(2)加载数据  fetch 主要影响 get/load
   (cascade={casadeType.ALL},fetch=FetchType.EAGER) //FetchType 取值(EAGER,LAZY)
(3)更新数据时 先做 load,再设值
(4)删除数据时 注意 casade 的设置问题,建议使 EJB QL,HQL

5.集合映射(了解)
  Set  参考多对多关系映射中(常用)
  List 雷同 Set(指定排序时@OrderBy("默认 Id 或者 属性 asc/desc"))
  Map  在设置 Set 的基础上设置@MapKey(name="map 中使用哪个字段作为 key") 
  //里面不能装载基础类型

6.继承映射(了解)
  (1)设计为一张表(父类和子类放在一张表中,使用一个标识列标识是哪个对象(type))
  (2)设计为多张表(父类一张,子类设计为分表)
  (3)设计一张共有的属性,子类保存特有属性
  //实现方式可以查找

7.树状映射(重要)
  实体类设计:(parent 表示父项)
  id,name,Set<parent>,parent
  在 parent 上@ManyToOne @JoinColumn(name="parent_id")
  在 Set 上@OneToMany(mappedBy="parent")
  –树状结构的打印

查询语言: NativeSQL(本地的 sql 语言)>HQL(hibernate query language)>EJB QL(JP QL 1.0)>QBC(Query By Cretira)>QBE(Query By Example)
HQL 和 EJB QL
 session.createQuery("查询语句");
 注明:category
1.from 类名
2.select distinct  from 类名
3.from 类名 where id >:min and  id<max
  Query.setInteger("min",2);
  Query.setInteger("max",2);
  Query.setParameter("max",3);
  Query.setMaxResults(4);   //最大结果集
  Query.setFirstResult(1);  //读取的起点
  Query.uniqueResult();
4.导航
  from topic t where t.category.id=1
  join  // 联合查询
      select t.tilte,c.name from topic t join t.category c
  is not null  //不为空
  is empty    //为空
  like ‘%_’   //模糊查询
 
5.函数
 
  lower()
  upper()
  trim()
  concat()
  length()
  (不常用)
  abs()
  sqrt()
  mod()
6.current_date 当前日期 current_time 当前时间 current_timestamp 当前日期和时间
7.查询
  count()
  group by 
  having
  avg()
  all()
  exists() / not exists()  //能用这个时就用这个
  in()  / not in()

8.session.getNameQuery("");

9.NativeQuery
  SQLQuery q=session.createSQLQuery("本地 sql 语句").addEntity(类名.class);
10.QBE
  Criteria c=session.createCriteria(类名.class).add(Restrictions.约束属性);

Hibernate 性能优化
1.session.clear() 分页时需要注意使用,打开了链接需要关闭
  内存泄露,java 语法上没有,而当加载许多的 session 时就会出现内存泄露
3.1+N 问题(当取一张关联了其他表的数据时,将会加载其他的数据引发许多的 sql 语句)
  取关联对象的值,将引发获取被关联的对象的值,这就是 1+N 问题
  (1)@ManyToOne(fetch=FetchType.Lazy)  //其他的被关联的对象语句将会在需要时发出
  (2)@BatchSize(size=5)  //只取五条数据,注解添加到被关联的对象上面 
  (3)join fetch: session.createQuery("from Topic t left join fetch t.category c");
             //使用了外连接,只发一条 sql 语句
4.list 和 iterator 的区别
 (1)iterator 先取 id 再取对象,重复使用时,先查找缓存,再查找数据库.
 (2)list  获取所有,不会查找 seesion,但会先保存到 session 中去
5.二级缓存和查询缓存(查询的是一样的数据)
 一级缓存:session 级别的缓存
 二级缓存:sessionFactory 级别的缓存
 
 load 默认使用二级缓存,iterator 默认使用二级缓存
 list 默认往二级缓存加数据,但查询时不先查询二级缓存
 二级缓存需要在配置文件中打开
 缓存算法: lru,lfu,fifo
6.事务并发处理
  a)acid
  b)事务的隔离级别
 

本文由 程序员百味 http://www.bywei.cn/blog 编写

 


百味博客 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:Hibernate 完全学习文档(ssh 框架)
喜欢 (0)
[微信扫一扫]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址