0-积累

来源:互联网 发布:企业 理财 知乎 编辑:程序博客网 时间:2024/05/16 04:55
1-当我们在使用find构建HQL后,而同样的查询也让iterate()来执行一次的话(前提是必须使用find()构建的HQL),那么iterate ()的执行并不再像前面介绍的那样会比find()方法多执行SQL,而是根本再执行一条SQL。这就是iterate()方法的使用。它使用了 Hibernate缓存机制.Find()方法在查询出结果后把查询结果集置入缓存,而iterate()执行的时候先执行一条Select SQL,查询所有符合条件的结果集,接下来iterate()根据查询的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,这时候
            
  1. package com.ideal.bugms.dao.hibernate;  
  2.   
  3. import java.io.IOException;  
  4. import java.io.Reader;  
  5. import java.io.StringReader;  
  6. import java.sql.PreparedStatement;  
  7. import java.sql.ResultSet;  
  8. import java.sql.SQLException;  
  9. import java.sql.Types;  
  10. import org.apache.commons.lang.ObjectUtils;  
  11.   
  12. import net.sf.hibernate.HibernateException;  
  13. import net.sf.hibernate.type.ImmutableType;  
  14.   
  15. public class StringClobType extends ImmutableType {  
  16.   
  17.     public Object get(ResultSet rs, String name) throws SQLException {  
  18.         Reader reader = rs.getCharacterStream(name);  
  19.         if (reader == null) {  
  20.             return null;  
  21.         }  
  22.         StringBuffer sb = new StringBuffer();  
  23.         try {  
  24.             char[] charbuf = new char[4096];  
  25.             for (int i = reader.read(charbuf); i > 0; i = reader.read(charbuf)) {  
  26.                 sb.append(charbuf, 0, i);  
  27.             }  
  28.         } catch (IOException e) {  
  29.             throw new SQLException(e.getMessage());  
  30.         }  
  31.         return sb.toString();  
  32.     }  
  33.     public Class returnedClass() {  
  34.         return String.class;  
  35.     }  
  36.     public void set(PreparedStatement st, Object value, int index)  
  37.             throws SQLException {  
  38.         StringReader r = new StringReader((String) value);  
  39.         st.setCharacterStream(index, r, ((String) value).length());  
  40.     }  
  41.     public int sqlType() {  
  42.         return Types.CLOB;  
  43.     }  
  44.     public String getName() {  
  45.         return "string";  
  46.     }  
  47.     public boolean hasNiceEquals() {  
  48.         return false;  
  49.     }  
  50.     public boolean equals(Object x, Object y) {  
  51.         return ObjectUtils.equals(x, y);  
  52.     }  
  53.     public String toXML(Object value) {  
  54.         return (String) value;  
  55.     }  
  56.     public Object fromStringValue(String arg0) throws HibernateException {  
  57.           
  58.         return null;  
  59.     }  
  60.     public String toString(Object arg0) throws HibernateException {  
  61.             return null;  
  62.     }  
  63.     public Class getReturnedClass() {  
  64.           
  65.         return null;  
  66.     }  
  67. }
            3.1其实你可以不用写这样的UserType,因为 Spring已经为你写好了,他提供了ClobStringType和BlobStringType,这样你就不用自己来写了,你要做的就是除了映射类 型,还有就是SessionFactory配置上一个lobHandler。这个对象来处理大对象。 写了上面的东西,你的代码可以跑以来,但不是显示有问题,就是插入“太大”的对象会出问题,比如就是数据库连接重置等问题。原因就是数据库驱动的问题,你用上Oracle10g的驱动就可以解决问题。
           3.2 你下载Oracle10g最新版本的JDBC驱动,然后在HBM映射文件中对应clob字段的使用type="text"类型,Java持久对象对应clob字段的定义为String,这样就OK了,完全不需要你那么麻烦。

4-
原创粉丝点击