1-当我们在使用find构建HQL后,而同样的查询也让iterate()来执行一次的话(前提是必须使用find()构建的HQL),那么iterate ()的执行并不再像前面介绍的那样会比find()方法多执行SQL,而是根本再执行一条SQL。这就是iterate()方法的使用。它使用了 Hibernate缓存机制.
Find()方法在查询出结果后把查询结果集置入缓存,而iterate()执行的时候先执行一条Select SQL,查询所有符合条件的结果集,接下来i
terate()根据查询的id在本地缓存中查找符合条件的结果集,如果有完全符合条件的结果集,则直接以此 作为返回结果。如果没有找到再执行相应的SQL,并且把结果纳入缓存当中,以备使用。缓存机制并不对find()方法起使用。如果你两次执行相同条件的或相近条件的HQL,第二个方法的SQL并不减少。还会照常执行。这就是说
缓存机制并不对find()方法起作用。find()对缓存只写不读,而iterate()方法就可以充分利用缓存的优势。
2-所有的双向关联需要有一端被设置为 inverse。在一个一对多(one-to-many)关联中 它必须是代表多(many)的那端。而在多对多(many-to-many)关联中,你可以任意选取一端,两端之间并没有差别。
3-当数据库类型为Clob时候,如果映射为Object则会报:property mapping has wrong number of columns,这时候
3.2 你下载Oracle10g最新版本的JDBC驱动,然后在HBM映射文件中对应clob字段的使用type="text"类型,Java持久对象对应clob字段的定义为String,这样就OK了,完全不需要你那么麻烦。
4-
2-所有的双向关联需要有一端被设置为 inverse。在一个一对多(one-to-many)关联中 它必须是代表多(many)的那端。而在多对多(many-to-many)关联中,你可以任意选取一端,两端之间并没有差别。
3-当数据库类型为Clob时候,如果映射为Object则会报:property mapping has wrong number of columns,这时候
- package com.ideal.bugms.dao.hibernate;
- import java.io.IOException;
- import java.io.Reader;
- import java.io.StringReader;
- import java.sql.PreparedStatement;
- import java.sql.ResultSet;
- import java.sql.SQLException;
- import java.sql.Types;
- import org.apache.commons.lang.ObjectUtils;
- import net.sf.hibernate.HibernateException;
- import net.sf.hibernate.type.ImmutableType;
- public class StringClobType extends ImmutableType {
- public Object get(ResultSet rs, String name) throws SQLException {
- Reader reader = rs.getCharacterStream(name);
- if (reader == null) {
- return null;
- }
- StringBuffer sb = new StringBuffer();
- try {
- char[] charbuf = new char[4096];
- for (int i = reader.read(charbuf); i > 0; i = reader.read(charbuf)) {
- sb.append(charbuf, 0, i);
- }
- } catch (IOException e) {
- throw new SQLException(e.getMessage());
- }
- return sb.toString();
- }
- public Class returnedClass() {
- return String.class;
- }
- public void set(PreparedStatement st, Object value, int index)
- throws SQLException {
- StringReader r = new StringReader((String) value);
- st.setCharacterStream(index, r, ((String) value).length());
- }
- public int sqlType() {
- return Types.CLOB;
- }
- public String getName() {
- return "string";
- }
- public boolean hasNiceEquals() {
- return false;
- }
- public boolean equals(Object x, Object y) {
- return ObjectUtils.equals(x, y);
- }
- public String toXML(Object value) {
- return (String) value;
- }
- public Object fromStringValue(String arg0) throws HibernateException {
- return null;
- }
- public String toString(Object arg0) throws HibernateException {
- return null;
- }
- public Class getReturnedClass() {
- return null;
- }
- }
3.2 你下载Oracle10g最新版本的JDBC驱动,然后在HBM映射文件中对应clob字段的使用type="text"类型,Java持久对象对应clob字段的定义为String,这样就OK了,完全不需要你那么麻烦。
4-