Hibernate笔记

来源:互联网 发布:ubuntu 配置ssh服务器 编辑:程序博客网 时间:2024/06/16 18:53

一、eclipse自动创建hbm文件

建立实体po类,右击类所在包,选择New》other ,输入hibernate,选中Hibernate Xml Mapping file (hbm.xml) 选项,next》选对应包》finish.

二、hibernate主键生成策略

"assigned"  :  主键由外部程序负责生成,在   save()   之前指定一个。
"hilo"  :  通过hi/lo   算法实现的主键生成机制,需要额外的数据库表或字段提供高位值来源。
"seqhilo"  :  与hilo   类似,通过hi/lo   算法实现的主键生成机制,需要数据库中的   Sequence,适用于支持   Sequence   的数据库,如Oracle。     
"increment"  :  主键按数值顺序递增。此方式的实现机制为在当前应用实例中维持一个变量,以保存着当前的最大值,之后每次需要生成主键的时候将此值加1作为主键。这种方式可能产生的问题是:不能在集群下使用。     
"identity"  :  采用数据库提供的主键生成机制。如DB2、SQL   Server、MySQL   中的主键生成机制。     
"sequence"  :  采用数据库提供的   sequence   机制生成主键。如   Oralce   中的Sequence。     
"native"  :  由   hibernate   根据使用的数据库自行判断采用   identity、hilo、sequence   其中一种作为主键生成方式。 
"uuid.hex"  :  由   Hibernate   基于128   位   UUID   算法   生成16   进制数值(编码后以长度32   的字符串表示)作为主键。
"uuid.string"  :  与uuid.hex   类似,只是生成的主键未进行编码(长度16),不能应用在   PostgreSQL   数据库中。
"foreign"  :   使用另外一个相关联的对象的标识符作为主键。

三、hibernate之constrained详解

    constrained只能在one-to-one的映射中使用,(一般在主表的映射中,有外键的那个表)。如果constrained=true,则表明存在外键与关联表对应,并且关联表中肯定存在对应的键与其对应, 另外该选项最关键的是影响save和delete的先后顺序。例如增加的时候,如果constainted=true,则会先增加关联表,然后增加本表。删除的时候反之。
    one-to-one的单向关联中,如果constrained=false,则会在查询时就全部取出来,用left outer join的方式。如果constrained=true,hibernate即会延迟加载sql,只把主表的查出来,等有用到关联表的再发sql取。
    one-to-one的双向关联中,必须设置constrained=true,要不然会有重复数据读,如2个表user,car;在位false时sql如下:select * from user a left outer join car b on a.id=b.id left outer join on user c on a.id=c.id where a.id=? 删除的时候最好删除从表,删除主表会先查询下主表,在联合查询下。

四、hibernate之inverse="true"

  inverse=true是交出控制权,但这里什么是控制权你理解的不好。 举一个例子: 一个国家主席 : 习近平 管理13亿人命 : 老百姓 这个是1-N的关系。 
1、如果习近平的inverse = false, 也就是在登录一条老板姓记录时,要执行两个SQL, 一个是插入老板姓这条记录,之后更新他,让他知道主席是习近平。 这就是所谓的控制权, 他来负责维护和他关联的表。 
 2、如果习近平的inverse = true, 这个时候登录一条老板姓的时候,只执行一条SQL, 这条SQL中,主席字段直接就是习近平。 这里习近平已经交出了控制权, 意味着他已经不关心老板姓是否知道主席是他, 主席是谁是交给老板姓自己来做了。
3、先保存习近平,再保存老百姓

五、Hibernate save()与persist()区别

1,persist把一个瞬态的实例持久化,但是并"不保证"标识符(identifier主键对应的属性)被立刻填入到持久化实例中,标识符的填入可能被推迟到flush的时候。
2,save, 把一个瞬态的实例持久化标识符,及时的产生,它要返回标识符,所以它会立即执行Sql insert


六、merge的作用

新new一个对象,

如果该对象设置了ID,则这个对象就当作游离态处理:

当ID在数据库中不能找到时,用update的话肯定会报异常,然而用merge的话,就会insert。
当ID在数据库中能找到的时候,update与merge的执行效果都是更新数据,发出update语句;
如果没有设置ID的话,则这个对象就当作瞬态处理:
用update的话,由于没有ID,所以会报异常,merge此时则会保存数据,根据ID生产策略生成一条数据;

七、HibernateDaoSupport

sf.getCurrentSession().saveOrUpdate(t);

public class OrderDao extends HibernateDaoSupport  //不建议用,hibe4中不用了

this.getHibernateTemplate().get()

八、hbm.xml里特殊属性map

<hibernate-mapping package="com.atguigu.surveypark.model">

<class name="com.atguigu.surveypark.model.User" table="users">

<property name="nickName" column="nickname" type="string" length="50" />

<property name="regDate" column="regdate" type="timestamp" update="false"/>

<set name="pages" inverse="true" order-by="id">

<property name="closed" column="closed" type="boolean" update="false"/>

<property name="orderno" type="float">

<!-- 显式指定字段类型 -->

<column name="orderno" sql-type="decimal(10,5)" />

</property>

<property name="minOrderno" formula="(select min(p.orderno) from pages p where p.surveyid = id)" />

<property name="orderno" type="float">

<!-- 显式指定字段类型 -->

<column name="orderno" sql-type="decimal(10,5)" />

</property>




0 0