aaron note hibernate

Hibernate 在线官方 单个html手册: 
http://docs.jboss.org/hibernate/stable/core/reference/en-US/html_single/


全局配置参数: http://docs.jboss.org/hibernate/stable/core/reference/en-US/html_single/#configuration-optional

disable Outer join fetching:  set hibernate.max_fetch_depth to 0
hibernate.jdbc.use_streams_for_binary: system-level setting only
enable hibernate.generate_statistics, and get stats via SessionFactory.getStatistics()


程序式:
Configuration cfg = new Configuration()
    .addResource("Item.hbm.xml")
    .addResource("Bid.hbm.xml");
配置文件式:
在hibernate.cfg.xml中配
<mapping resource="events/Event.hbm.xml"/>
<mapping resource="events/Person.hbm.xml"/>

多对多双向 inverse="true", 增加或删除一边 程序需要两边都操作

生产环境不要使用hibernate.connection.pool_size, 请使用 c3p0或dbcp 等第三方连接池

借助spring或jta 实现 Open Session in View

表名不同的表,它们都对应相同的一个类, 动态映射 用NamingStrategy
或者想按日期自动分表, 也可以用NamingStrategy

POJO 根据业务, implements
public boolean equals(Object other)
public int hashCode()
方法,
可用于不同session中的对象的是否equal的比较
也可用于detached的对象的reattachment

动态模型, 不用写持久化类, 只写映射文件就行了
当数据结构发生变化的时候, 只需要修改hbm文件即可改变映射模型,而不需要修改java实体类代码(部分情况下是这样的, 一般是改变映射关系, 而增加新属性, 属性是外部资源获取的, 肯定不行了)
运行期使用Map

<id name="userinfoId" type="java.lang.Long" unsaved-value="null">
<column name="USERINFO_ID" />
<generator class="native" />
</id>

<class
proxy指定用于lazy的代理类
dynamic-update只更新改变的属性, 需要先load或get, 同时在session里改变属性, 也就是说必须是Persistent对象
dynamic-insert只插入改变的属性
(两个动态 是存在缺点的, 需要临时组织sql语句, 而不能使用预编译好的sql语句)
where强制额外的查询条件
lazy="false"禁用lazy
optimistic-lock使用乐观锁
check没明白, 可能用于在自增id自增前 进行 多个字段联合的约束检查
rowid对应数据库内部的行id, 如oracle的rowid
subselect同时子查询

createQuery执行HSQL
createQuery.setParameter实现像oracle一样地赋参数
createSQLQuery.addEntity来执行原始SQL获取数据, 并实现手动映射
createSQLQuery.executeUpdate()来执行原始SQL
两种方法最后.list()立即获取, .iterate()相当于lazy获取

分页.createQuery(hql).setFirstResult(20).setMaxResults(10).list();
复杂查询.createCriteria(User.class).add(Restrictions.lt("birthday", new Date())).add(Restrictions.or(Restrictions.eq("name", "wj"), Restrictions.eq("name", "name0"))).list();

discriminator 继承类的属性在同一张表
joined-subclass 继承类的属性在多张表
discriminator和join可以结合
union-subclass 每个类都对应自己的表



怎么解决n +1 问题? 
1 )lazy=true, hibernate3开始已经默认是lazy=true了;lazy=true时不会立刻查询关联对象,只有当需要关联对象(访问其属性,非id字段)时才会发生查询动作。 
2)二级缓存, 在对象更新,删除,添加相对于查询要少得多时, 二级缓存的应用将不怕n +1 问题,因为即使第一次查询很慢,之后直接缓存命中也是很快的。 
不同解决方法,不同的思路,第二条却刚好又利用了n +1 。
3) 当然你也可以设定fetch=join



<component: combine several fields into another class

<hibernate-mapping
default-access="field|property|ClassName": skip getter and setter
auto-import="false": when you have two class who have the same class name(not in one namespace), then use for one that you do not want to auto-import(query: from com.test.bean.User)



......(Continuing)

你可能感兴趣的:(Hibernate,职场,休闲)