hibernate学习总结
1、 一个项目只需要有一个SessionFactory即可。所以有个HibernateUtil类,使用单例返回SessionFactory类即可。可以从Hibernate下载API文档中找到。
2、 @id标识主键
3、 @Entity是一个标准(javax.persistence.Entity是一个标准)。就像JPA(java persistence API)是一个标准,hibernate是它的实现。
4、 @Transient标识某个字段后,标识这个字段不会持久化到数据库中。在xml中对这个字段不做配置就标识不会持久化到数据库中;
5、 hibernate默认是自动持久化,字段不加标注,表示@Basic。
6、 Date类型持久化的默认类型是DateTime(日期+时间),可以加注释来配置只存日期或者时间或者日期+时间。比如使用@Temporal(TemporalType.DATE),来配置只存日期。(注在注解中如果是“value”属性的话,可以不写value,直接写具体值即可,比如刚刚的标注)。
7、 @GeneratedValue主键生成方式
8、 @TableGenerator 使用的主键值生成原理是以前架构师使用的那张专门为每个表生成主键值的方式。
9、 使用StudentPk类标识联合主键,需要实现Serializable(序列化,传输)
10、联合主键用@EmbeddedId标识组件属性。annotate the component property as @EmbeddedId
11、JTA:JAVA TRANSACTION API。JTA事务是管理多个数据库同时操作的事务的。ApplicationServer帮助提供的事务管理器,往往用于分布式事务,不是分布式事务也能用。Jboss可以提供Transactionmanager,Spring 也可以提供TransactionManager。
Thread:从上下文中查找连接,用的是数据库提供的事务。
12、Hibernate中的三个对象状态:
Transient:内存中的一个对象,没有ID,数据库中没有,Session的缓存中没有。
Persisntent:内存中有,数据库有,缓存中有,有ID
Detached:缓存中没有,内存中有,数据库中有。
13、Load/get:
load:返回代理对象,等到用到对象内容时才真正发出SQL语句。即延迟加载。当session关闭后,如果此时才开始调用对象内容,会出现LazyInitializationException。
get:直接从数据库中加载,不延迟加载
14、只更新部分更改的字段:
使用建议方式:HQL。 当然,如果整体更新可以接受,那就是用hibernate默认的update方法也无妨。
15、clear方法:
无论是load还是get,首先会查找缓存(一级缓存),如果没有,才会去数据库查找。调用clear可以强制清除session缓存。
Flush方法:
强制从内存到数据库的同步。
16、session中有个缓存。
17、@OneToOne
@JoinColumn(name=“wifeId”)
定义一对一关系,数据库中外键的名称叫做wifeId。
18、@OneToOne(mappedby=wife) 表示一对一双向关联,但主导是对方,被对方映射,使用对方类里面的wife(get方法后面的名称),通常跟属性一样的。在数据库中,由husband表中存储一个外键来表示husband与wife表之间的一对一关系,在对方的表里存储一个外键关联关系。
19、 规律:凡是双向关联,必设mappedBy。
20、一对一单向和一对一双向,在数据库中表现是一样的。两张表中,只有一张表中存储外键来表示两张表之间的关系。
但是,一对一双向的,可以从每一方那里获取对方,而一对一单向只能能一方获取到对方,另一方不能获取到对方。
21、组件映射:
@Embeded
22、One-to-Many单向关联
@OneToMany
@JoinColumn(name=“groupId”)--------使用这个标记,可以让一的一方加入外键关系。否则,如果只写@OneToMany,会在一和多的中间加入中间表来表示两者关系。
23、One-to-Many和Many-to-One双向关联:
在一的一方的采用如下写法:
@OneToMany(mappedBy=“group”)
在多的一方采用如下写法:
@ManyToOne
24、可以进行Cascade级联存储,当然,也可以一个一个表的进行存储,不设置cascade。
25、规律:双向关系,在程序中要设置好双向关联。
26、Cascade:不影响读取,管CUD
27、Fetch:管load/get
Fetch = FetchType.EAGER/LAZY
28、Onet-to-many : fetch设置lazy(最佳实践),当然,有时也用eager,比如用户权限关系。
29、Many-to-one: fetch设置eager(最佳实践)
30、Cascade:帮我们省去一些编程,作用不是太大。
31、要想删除或者更新,先做load,除了精确知道ID之外。
32、要想设置关联关系,先设定关系为NULL,再删除对应记录。如果不删记录,该记录就变成垃圾数据。当然,也可以使用hql语言来处理。
33、Hibernate 查询:
l Native Sql 〉HQL〉EJBQL(JPA QL 1.0)〉QBC(QUERY BY CRITERIA)〉QBE(QUERY BY EXAMPLE)
l 总结:QL应该和导航关系(比如@onetomany等)结合,共同为查询提供服务。
l Criteria:标准、准则、约束. Session.createCriteria(类名.class)意思是“from 类名”
l Example:设置一个典型。加入约束Criteria中
34、1+N问题(1条sql搞定的事,但是却另外还引出N条关联表的sql语句,比如@manytoone fetchsize=EAGER):
l FetchType.LAZY
l @BatchSize
l Join fetch(默认的Criteria就是用这个)
35、List和iterator区别:
l List取所有
l Iterator先取id,等用到对象的时候,再根据id取对象
l Session中list第二次发出,仍会到数据库查询
l Iterator第二次,首先找session级缓存。
36、应用心得:
l 如果hibernate本身不能满足项目查询需求,可以使用hql语句,还不行的话,可以使用视图来解决查询问题。(王乐 2014-2-22)