hibernate学习

24 篇文章 0 订阅


//hibernate学习笔记
学习hibernate:
middlegen
Hibernate 基本语义
Configuration\sesionFactory\Session
Hibernate高级特性
XDoclet 与 Hibernate的映射
数据检索
数据关联
数据访问
事务管理
Hibernate分页
Cache管理
Session管理
Hibernate in Spring
对象关系型数据映射:orm(object relational mapping) 映射文件".hbm.xml"
构建hebernate基本代码的通常做法:
1.手工编写
2.从关系型数据库导出表结构,生成orm文件和java代码(推荐)(middlegen-guberbate)
3.通过java代码生成对应的映射文件,将java代码和数据库绑定(xdoclet)
映射文件中的主键生成发生:increment(少用 多个实例访问数据库可能造成主键重复)
Hibernate的配置
Hibernate.cfg.xml(hibernate.propertys)
sessionFactory 负责创建session实例.通过configuration 实例构建sessionFactory
Configuration config = new Configuration().configure();
SessionFactory sessionFactory = config.buildSessionFactory();
Session 是持久层操作的基础,相当于jdbc中的connection
sessionFactory.openSession();
Session提供所提供的save、find、flush等方法完成持久层操作
Session.flush()强制数据库同步,事务提交的时候hibernate会自动调用flush方法,session关闭也会自动执行flush方法
Hibernate-doclet使用
下面是XDoclet的一些build.xml
<?xml version="1.0" encoding="GBK"?>
<project name="构建脚本" default="生成Hibernate配置文件" basedir=".">
    <property name="src.dir" value="${basedir}/src"/>
    <property name="build.dir" value="${basedir}/bin"/>
<property name="xdoclet.home" value="D:/xdoclet/xdoclet-plugins-1.0.3"/>
    <!-- Build classpath -->
    <path id="xdoclet.task.classpath">
       <fileset dir="${xdoclet.home}/lib">
          <include name="**/*.jar"/>
       </fileset>
       <fileset dir="${xdoclet.home}/plugins">
          <include name="**/*.jar"/>
       </fileset>
    </path>
<taskdef 
  name="xdoclet"
  classname="org.xdoclet.ant.XDocletTask"
  classpathref="xdoclet.task.classpath"
/>
 
<target name="生成Hibernate配置文件">
  <xdoclet>
   <fileset dir="${src.dir}/com/csy/model">
    <include name="**/*.java"/>
   </fileset>   
   <component
    classname="org.xdoclet.plugin.hibernate.HibernateConfigPlugin"
    destdir="${src.dir}"
    version="3.0"
    hbm2ddlauto="update"
    jdbcurl="jdbc:mysql://127.0.0.1/csy"
    jdbcdriver="com.mysql.jdbc.Driver"
    jdbcusername="root"
    jdbcpassword="bjsxt"
    dialect="org.hibernate.dialect.MySQLDialect"
    showsql="true"
   />
  </xdoclet>
</target>
<target name="生成hibernate映射文件">
  <xdoclet>
   <fileset dir="${src.dir}/com/csy/model">
    <include name="**/*.java"/>
   </fileset>
   <component 
    classname="org.xdoclet.plugin.hibernate.HibernateMappingPlugin"
    version="3.0"
    destdir="${src.dir}"
   />
  </xdoclet>
</target>
</project>

下面列举了点XDoclet的常用语法,官方指南http://xdoclet.sourceforge.net/xdoclet/tags/hibernate-tags.html
和 http://www.hibernate.org
他可分为class层面和method层面
/**
* @hibernate.class 
* table="T_ACL"
* dynamic-update="true"
* dynamic-insert="true"
* proxy=""
* discriminator-value="1"
*/
 
/**
  * @hibernate.id generator-class="native"
  */
 
/**
  * @hibernate.set lazy="extra" inverse="true"
  * @hibernate.key column="pid"
  * @hibernate.one-to-many class="com.csy.userBean"
  */
 
/**
  * @hibernate.many-to-one unique="true"
  */
 
/**
  * @hibernate.property  
  *   unique="true"
  *   not-null="true"
  */
 
/**
  * @hibernate.one-to-one property-ref="person"
  */

 
class层面有:
@hibernate.cache
@hibernate.jcs-cache
@hibernate.joined-subclass
@hibernate.joined-subclass-key
@hibernate.query

 
method 层面
 
@hibernate.array
@hibernate.bag
@hibernate.collection-cache
@hibernate.collection-composite-element
@hibernate.collection-element
@hibernate.collection-index
@hibernate.collection-jcs-cache

现在学习下 数据检索 
有三种:
1.Criteria Query 
2.Hibernate Query Language (HQL)
3.SQL

先说下Criteria Query的用法:通过面向对象的设计
将数据查询封装为一个对象
 
Criteria criteria = session.createCriteria(TUser.class);
criteria.add(Expression.eq("name","csy"));
criteria.add(Expression.eq("age",18));
//相当于 select * from t_user where name="csy" and age=18
其中Expression提供了对应的查询限定机制,包括:
Expression.eq
Expression.allEq
Expression.gt
Expression.ge
Expression.lt
Expression.le
Expression.between 
例子:
Expression.between("age",new Integer(10),new Integer(18));
Expression.like
Expression.in
Expression.eqProperty (用于比较两个属性的值)例子:
Expression.eqProperty(
    "UserBean.ClassId",
    "ClassBean.id"
);//对应于sql语句里面的UserBean.ClassId = ClassBean.id
Expression.gtProperty
Expression.geProperty
Expression.ltProperty
Expression.and例子:
Expression.and(
    Expression.eq("name","Erica"),
    Expression.eq(
    "sex",new Integer(1)
    )
)
Expression.or
Expression.sql(
    "lower({alias}.name) like lower(?)",
    "csy%",
    Hibernate.STRING
)
 
限定换回记录
criteria.setFristResult/setMaxResults
对查询结果进行排序
criteria.addOrder(Order.asc("name"));
criteria.addOrder(Order.desc("age"));

实际的项目中强烈推荐hql语言
hql的格式如下:
 
String hql = "from UserBean as user where user.name='csy'";
Query query = session.createQuery(hql);
List userList = query.list();
//有时间再总结下hql的所有用法
下面学习下hibernate 的数据关联
其中一对一关联 如用户和身份证就是一对一的关联
只要在主控方进行控制
one-to-one节点有以下属性
复制内容到剪贴板

 
代码:

name 映射属性
class 映射类
cascade :all:none:save-update:delete
级联(cascade)指的是 :当主控方执行操作时候,关联对象(被动方)
同步执行同一操作。如对主控方对象调用save-update或delete方法时
是否通俗对关联对象(被动方)进行save-update或者delete操作
下面是一对多的操作
复制内容到剪贴板
代码:
单向一对多 只要在一的一方进行配置
双向一对多 要在两边都进行配置
一对多例子:用户和地址
user.getAddresses().add(addr);
session.save(user);//通过主控对象级联更新
tx.commit();

hibernate会分两步来对地址的操作
save(user)时
insert into t_address(user_id,address) values (null,"南京")
tx.commit()时
update t_address set user_id="1" ,address="南京" where id = 2

这样会有问题:t_address.user_id 为"NOT NULL"就会报错
出现以上问题的原因是:inverse 为"true"
关联方向是单向,关联关系由userBean对象维护而被关联的addressBean对象本身并不知道自己于userBean对象向关联
也就是addressBean不知道user_id设什么值
所以是保存addressBean时候关联字段先插入一个空值,再由userBean对象将自身的id赋予关联字段addressBean.user_id
导致address对象发生变化,commit的时候会通过update sql 保存到数据库
以上会出现约束为例,关联字段允许为null
最后的解决方式:让addressBean对象知道获取user_id字段,这样还少了update语句,提高了性能
双向一对多的关系就可以解决上面的问题
一对多 
inverse 为“true”  这意味这主控方不再是UserBean,把关联关系交给addressBean,这样就可以主动去获取UserBean的id并将其作为自己的user_id
java代码编写有所改变:
add.setUser(user);//设置关联的userBean对象
user.getAddresses().add(addr);

--------------------- 
作者:csy2005csy 
来源:CSDN 
原文:https://blog.csdn.net/csy2005csy/article/details/6953953 
版权声明:本文为博主原创文章,转载请附上博文链接!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值