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)