[Hibernate] 屏蔽关系映射
-运行机制:
Client-> new Strudent() -> newConfiguration() -> new SessionFactory() -> new Session() ->session.Save(Student) -> persist DB
-配置文件(参考文档!)
默认全局的配置文件名:hibernate.cfg. xml , domainModel的mapping-file
若用Annotation版本,无需配置mapping-file 但要配置mapping class。
*建议写Hibernate辅助类Util (参考文档)
Hibernate.cfg.xml:
-hbm2ddl.auto
-create 没有表时 自动创建 (常用)
-update 表中属性不一样时 更新
-create-drop 显式关闭sessionFactory后删除数据库.
-show_sql /format_sql
True 打印sql语句。
-dynamic-update 动态更新 sql语句只更新修改过的列
-联合主键 创建主键类(实现serializable接口 重写equals和hashCode方法)
-Xml<composite-id name=”attribute” class=”classname”>
<key-property name==…../>
-annotation
-@embeddable 将类注明可嵌入组件 主键属性设为@Id
*-@embededId 将属性注明可嵌入组件id
*-@IdClass(ClassPKName) 主键类什么都不需要注明
将model类注明IdClass 主键属性设为id
-ID生成策略
-generator native/sequence/hilo/indentity
-@GeneratorValue[(strategy=GeneratorType=type)] auto/table/identity/squence
-指定sequence
在类名前加
@SequenceGenerator(name=”generatorName”,generator=”sequenceName”);
在GeneratorValue中指定生成器。
-annotations
-@transient 透明的。。。不存储在数据库中。在xml实现 不写该属性即可。
-@column (updatable=false) 不参与更新
-指定Hibernate配置文件
在config方法中加参数,参数名配置文件名、默认在src路径下。
-SessionFactory: singlemodel 一般访问多个数据库的时候才会有多个
-openSession 每次都建新的 需要close
-getCurrentSession 从上下文找,找到旧的,用旧的 ,没有则建新的。
-用途 界定事务边界
-事务提交后自动close
-3种对象状态
-Transient 对象刚创建内存中有对象 没ID 缓存中也没有ID
-Persistent 持久化 内存中有 缓存中有 数据库中有ID
-Detached 脱离session 内存中有 缓存中没有 数据库有ID
-Session 管理一个数据库的任务单元
-load 代理对象 调用对象内容的时候才会发出sql语句 关闭session后会报错
-get 直接发出sql语句 拿到对象
-clear 强制清除session缓存。
-Junit 不报错也不显示结果解决方案:
-加try-catch 语句;
-将代码放到main方法中。
-Log4j 配置:
-导入log4j.jar slf4j-log4j.jar slf4j-api.jar
-配置文件放到src目录下。
-Junit 配置:
-导入Junit.Jar 即可。建议建一新目录test 专门存储进行测试的文件。
-映射:
-一对一
-@OneToOne创建外键 mappedBy 以哪个FK为主导。
-@JoinColumn设定外键列名
-组件映射
-@Embedded 组件嵌入 @AttributeOverride 属性重写
-一对多与多对一
-@ManyToOne 写在‘多’的类中
-@OneToMany 写在‘一’的类中 生成中间表 ;
加@JoinColumn消除中间表
-多对多
-@ManyToMany
@JoinTable定义表属性
@JoinColumns 定义列属性 @inverseJoinColumns 对方表的属性
-casecade 在*To*标签中设置casecade类型可设定关联关系CUD 格式
-fetch在*To*标签中设置casecade类型可设定关联关系RUD 格式
双向关联,两者可以互相拿到对方,方便进行CRUD (双向关联不常用)
双向关联时,在程序中需设定双向导航(关联属性)
-Delete
删除对象,消除级联关系,只需将关系设为null再删除即可 or 用HQL或EJBQL
-内存优化
-1+N问题:在一对多问题中 FetchType设为eager 会发出1+N(多余)的SQ;语句
-将ManyToOne 设为LAZY
-JoinFetch用createCritera方法
-@BatchSize 设定每次拿该类对象的条数
-list与iterator
-list直接取所有的对象 iterator 先取id 等用到的时候再取对象
-list每次取都从数据库中取对象 iterator则先从缓存中取
-Hibernate锁
-悲观锁:在session中加LockModel 。数据库加锁
-乐观锁:在类中新加属性并注明@version 效率比较高。
*************树状结构表实现************
使用Hibernate后,配置环境繁琐了但把面向关系的数据库编程转换为了面向对象的编程,使开发人员不必考虑具体的SQL语句,提高开发效率。
*用Myeclipse直接创建Hibernate项目!~
*MySQL默认用户”root”@”localhost” ;