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>
- Hibernate笔记
- Hibernate 笔记
- Hibernate笔记
- Hibernate笔记
- Hibernate笔记
- hibernate笔记
- Hibernate笔记
- Hibernate笔记
- hibernate笔记
- hibernate笔记
- Hibernate笔记
- hibernate 笔记
- Hibernate笔记
- Hibernate笔记
- Hibernate 笔记
- Hibernate 笔记
- Hibernate 笔记
- Hibernate笔记
- Hibernate update 只更新被修改字段
- 默然相愛.寂靜歡喜
- JAXB的工作原理与基本用法
- Linux ALSA声卡驱动之二:声卡的创建
- Mybatis int 判断非空的坑
- Hibernate笔记
- 规范化和其他基本设计问题
- Android设计模式的学习——序言
- Linux性能优化和监控系列(二)分析CPU性能
- 自定义Collection View布局
- ZooKeeper系列之六:ZooKeeper四字命令
- IONIC项目JPUSH消息推送IOS集成
- python之from...import...和import
- 优化小计,304和202