hibernate学习笔记-1

 

hibernate学习笔记
1.annonation有两种方式:
<1>JPA -------重点
<2>hibernate-extension

jpa是标准,hibernate是实现
jdbc是标准

使用annonation的时候需要使用的配置类是AnnonationConfiguration
@Entity
@Id
永远建议自己查文档,原始的文档

动态代理
往需要代理的类的方法中增加代码,比如计算时间的代码插入到某个方式的开始和结束,根本看不到中间类的生成过程。
外层和内层搞的比较头脑混乱,不过还能跟上

好处:可以对任意的对象,任意的接口方法,实现动态的代理
什么叫动态代理,动态代理是怎么产生的?

工厂方法模式
依赖倒置原则,要依赖抽象,不要依赖具体类

继承和聚合

计算方法的时间和日志
spring使用java jdk的动态代理类

rmi远程调用
rmic xxxx
rmiregistry

headfirst sql
uml
UML for Java Programmers

抽象类继承抽象类,可以将非抽象方法重写为抽象方法
模式::在某情境下,针对某问题的某种解决方案

2012-03-06
都写在get方法中
@Column(name="_name")
@Transient
一般在java类中都用java.util.Date
@Temporal(TemporalType.TIMESTAMP)
注解中一个属性名称叫value就可以不写,直接写值@Temporal(TemporalType.TIMESTAMP)等同于@Temporal(value="TemporalType.TIMESTAMP")
枚举类型
@Enumerated(EnumType.STRING)
hibernate中映射的时候有get方法就要有对应的set方法
表中的字段名是根据get方法来获得的

hibernate的重点:
hibernate核心开发接口(重点)
关系映射(重点)
HQL(重点)
性能优化(重点)

id生成策略
 <generator class="native"/>
 getCurrentsession方法无法获得的问题
 
20120-03-08
-------------------------------------------------------------------------
-------------深刻理解OOA/OOD/OOP编程思想,掌握多种常用的设计模式----
-------------------------------------------------------------------------
@GeneratedValue(strategy=GenerationType.AUTO)
使用这个策略的时候,如果是mysql的表,需要表中id字段是自增属性,否则报错
mysql和sqlserver支持identity
@GeneratedValue(strategy=GenerationType.AUTO, generator="SEQ_STORE")
@SequenceGenerator(name="SEQ_STORE", sequenceName="my_sequence")
如果不配置generator="SEQ_STORE"那么hibernate建的表的sequence都叫hibernate_sequence
@GeneratedValue(strategy=GenerationType.TABLE, generator="Teacher_GEN")的用法,有点复杂,用的时候查
知道有这几种方式,具体配置可以用的时候查。主要是知道什么时候用哪种方式。

联合主键--设计表的时候尽量少用联合主键
创造一个主键类----实现一个Seraliable接口,实现equals方法和hashCode方法
annonation方式简单有3种方法,查文档都能解决
@Embeddable可以被嵌入的

核心开发接口(重点)
sessionFactory维护数据库的连接池,一般情况,每一个session都有一个数据库链接
sessionFactory.openSession()永远打开新的Session,需要close()
sessionFactory.getCurrentSession()从上下文找,如果当前环境有Session了,就从当前环境拿Session,如果当前session被提交了,会产生新的Session
用途:界定事物边界,事物提交,自动close()

current_session_context_class
thread从线程中,使用connection来管理事物;
jta---java transaction API 由中间件来提供
jpa---java persistance API
跟管理分布式事物相关,JTA transactionManager tomcat本身不行,要借助spring才可以
事物有两种:1.依赖于connection,针对一个数据库;2.jta transactionManager
EJB3分布式的东西

对象的3中状态:
Transient(瞬态):刚刚new出来,没有设置id    ---内存中的一个对象,没id,session缓存中没有,数据库里也没有
Persistent(持久化):调用save或者saveOrUpdate后就变成这个状态,有id ---内存中有,session缓存中有,数据库中也有,有id
Detached(脱管):session关闭后(或者commit后),对象变成detached的了 ---t对象内存还有,session缓存没有,但是脱离管理了,数据库中有,有id
区分:
1.有没有id;
2.id在数据库中有没有;
3.id在内存中有没有
session里面有个map,map的key是id,value是对象的引用,缓存可以提高效率。最开始new的时候还没有

delete()后就变成了Transient状态,必须有id才能delete()
load()两个参数,一个是class,第二个是主键。load后是Persistent状态

get()和load的区别
get()发出sql,取出值来装到对象中。
load()生成的是对象的代理,并没语有生成真正的sql句。需要发送sql语句的时候才发送(你用了那个对象)。
update()会更新所有的字段
更新部分字段的方法(提高效率):如果一个对象是p状态,设定不同字段在事物提交的时候就会发生更新!!!!!缓存和数据库间的同步
三种方法可以实现部分字段更新:
1.修改注解@Column(updatable=false),不灵活,基本不用
2.只能在xml下做通过<class name="Student" table="student" dynamic-update="true">在同一个session里面管用,跨session不管用,要在内存中比较什么改变了。
session2.merge(t);先select再局部update
3.直接使用HQL语句
Query q = session.createQuery("update Student s set s.name='z5' where s.id=1");
Query来自org.hibernate.Query
saveOrUpdate()
clear()清理session缓存,跟数据库不打交道
flush()强制同步session缓存和数据库,默认在提交的时候才提交

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值