Commons Collections之Predicates学习
今天无聊没事做,看到Commons Collections的东西,对Predicates接口和它下面挂着的几个类做了些研究,其实看了源代码之后,就知道很简单了。总结刚才的学习结果:
补充一下一个概念,函子(functor):执行操作或功能的部件,Predicates下面挂着的实现类就是一个函子,执行了各种逻辑运算和判断,你也可以根据自己的需要,实现Predicates类,实现evaluate方法,根据自己定义的算法来实现某一特定判断。
先看,Predicates的几个实现类,清单如下:
EqualPredicate IdentityPredicate NotPredicate InstanceofPredicate NullIsTruePredicate NullIsFalsePredicate NotNullPredicate TruePredicate FalsePredicate UniquePredicate AndPredicate OrPredicate AllPredicate AnyPredicate OnePredicate |
并写了一个Demo程序,将几个Predicates的区别写在了程序的注释中,这是我的习惯。呵呵~~
public void testPredicate(){ //相当于调用equals对比 Predicate equal = new EqualPredicate("cst"); boolean resultEqual = equal.evaluate("cst"); System.out.println("EqualPredicate:"+resultEqual); //相当于调用 == 对比 Predicate identity = new IdentityPredicate(new String("cst")); boolean resultIdentity = identity.evaluate(new String("cst")); System.out.println("IdentityPredicate:"+resultIdentity); //装饰给定的Predicate指定对象想比,并返回相反的值 Predicate not = new NotPredicate(equal); boolean resultNot = not.evaluate("cst"); System.out.println("NotPredicate:"+resultNot); //相当于instanceof 对比 Predicate instanceOf = new InstanceofPredicate(String.class); boolean resultInstanceof = instanceOf.evaluate("cst"); System.out.println("InstanceofPredicate:"+resultInstanceof); // 装饰给定的Predicate //如果对象为null则返回true,否则返回给定Predicate的判定值 Predicate nullIsTrue = new NullIsTruePredicate(equal); boolean resultNullIsTrue = nullIsTrue.evaluate(null); System.out.println("NullIsTruePredicate:"+resultNullIsTrue); // 装饰给定的Predicate // 如果对象为null则返回false,否则返回给定Predicate的判定值 Predicate nullIsFalse = new NullIsFalsePredicate(equal); boolean resultNullIsFalse = nullIsFalse.evaluate(null); System.out.println("NullIsFalsePredicate:"+resultNullIsFalse); //当对象不为null时返回true Predicate notNull = NotNullPredicate.getInstance(); boolean resultNotNull = notNull.evaluate(null); System.out.println("NotNullPredicate:"+resultNotNull); // 总是返回true Predicate truep = TruePredicate.getInstance(); boolean resultTrue = truep.evaluate("cst"); System.out.println("TruePredicate:"+resultTrue); // 总是返回false Predicate falsep = FalsePredicate.getInstance(); boolean resultFalse = falsep.evaluate("cst"); System.out.println("FalsePredicate:"+resultFalse); // 首次evaluate判定对象总是返回true。 // 其内部维护一个HashSet,每次调用evaluate(obj) //将会调用HashSet的add方法。该类常用于Collections过滤重复的对象。 UniquePredicate unique = new UniquePredicate(); boolean resultUnique1 = unique.evaluate("cst"); boolean resultUnique2 = unique.evaluate("cst"); System.out.println("UniquePredicate1:"+resultUnique1); System.out.println("UniquePredicate2:"+resultUnique2); ///////////////////以下是实现复杂的逻辑///////////////////////// //装饰两个Predicate 判断返回两个Predicate和指定对象比较后and的结果 Predicate and = new AndPredicate(equal, identity); boolean resultAnd = and.evaluate("cst"); System.out.println("AndPredicate:"+resultAnd); //装饰两个Predicate 判断返回两个Predicate和指定对象比较后or的结果 Predicate or = new OrPredicate(equal, identity); boolean resultOr = or.evaluate("cst"); System.out.println("OrPredicate:"+resultOr); //多个Predicate指定对象比较后多个and的结果 Predicate [] predicates = new Predicate[]{equal,identity,not}; Predicate all = new AllPredicate(predicates); boolean resultAll = all.evaluate("cst"); System.out.println("AllPredicate:"+resultAll); //多个Predicate指定对象比较后多个or的结果 Predicate any = new AnyPredicate(predicates); boolean resultAny = any.evaluate("cst"); System.out.println("AnyPredicate:"+resultAny); //多个Predicate指定对象比较后,只要有一个结果为true就为true Predicate one = new OnePredicate(predicates); boolean resultOne = one.evaluate("cst"); System.out.println("OnePredicate:"+resultOne); }
运行结果:
EqualPredicate:true IdentityPredicate:false NotPredicate:false InstanceofPredicate:true NullIsTruePredicate:true NullIsFalsePredicate:false NotNullPredicate:false TruePredicate:true FalsePredicate:false UniquePredicate1:true UniquePredicate2:false AndPredicate:false OrPredicate:true AllPredicate:false AnyPredicate:true OnePredicate:tru
继续学习Commons Collections的其他东东~~了解下,方便日后少写人家已经实现过的代码。
Google Collections 学习小结
今天,浏览别人的技术博客的时候,无意中看到Google Colections这个东东,下载看了相关资料,感觉还不错,某些场合还挺好用的。主要是提供了更多集合供用户使用,Google Collections是基于JDK5.0上的扩展。用起来方便,前不久1.0版本正式发布。今天花了些时间了解内容。注意几个新的集合的特点。
要用Google Collections 要导入google-collect-1.0.jar包才可以,以下是今天写的一些Demo程序,为了方便,把一些相关知识写在代码里面的注释上了。
public class GoogleCollectionsDemo { /** * 比较传统的JDK与Google Collections获取不可修改的List集合 */ public void testImmutableList(){ //1.JDK5.0 传统的方式 List<String> names = new ArrayList<String>(); names.add("james"); names.add("bryant"); List<String> immutableNamesJdk = Collections.unmodifiableList(names); System.out.println("JDK1.5方式:"+immutableNamesJdk); //2.Google Collections 第一种方式获取 List<String> immutableNamesGoogle1 = ImmutableList.of("james", "bryant"); System.out.println("Google Collections获取方式1:"+immutableNamesGoogle1); //2.Google Collections 第二种方式获取 ImmutableList.Builder<String> builder= ImmutableList.builder(); builder.add("james","bryant"); ImmutableList<String> immutableNamesGoogle2 = builder.build(); System.out.println("Google Collections获取方式2:"+immutableNamesGoogle2); } /** * 测试Multiset的用法 */ public void testMultiset(){ //对比: //1.JDK5.0 中的Set是一个无序不重复的集合 //2.Google Collections的MultiSet是一个无序但是可添加重复的元素的集合 Multiset<String> multiSet = HashMultiset.create(); multiSet.add("james"); multiSet.add("bryant"); multiSet.add("james"); //MultiSet用来计数统计是很方便的,传统的需要用Map把值取出来+1再放回去 System.out.println("获取Multiset中的james个数:"+multiSet.count("james")); System.out.println("Multiset中的元素:"+multiSet); } /** * 测试Multimap的用法 */ public void testMultimap(){ //对比: //Google Collections 的MultiMap<K,V> 类似于 Map<K ,Collection<V>> Multimap<String, String> multiMap = HashMultimap.create(); multiMap.put("23", "james"); multiMap.put("24", "bryant"); multiMap.put("23", "jordan"); //注意,MultiMap取得的数据不是String类型,而是Collection类型 Collection<String> collection = multiMap.get("23"); System.out.println("23号球员有:"+collection); } /** * 测试BiMap的用法 */ public void testBiMap(){ // Google Collections 的BiMap 是一个双向的Map // 可以根据Key得到value,也可以根据value得到key // BiMap的健唯一、值也唯一 BiMap<String, String> biMap = HashBiMap.create(); biMap.put("23Cel", "james"); biMap.put("24Laker", "bryant"); System.out.println("获取23Cel的值:"+biMap.get("23Cel")); // 将Map反向,即得到Map<V,K> BiMap<String , String> inverseMap = biMap.inverse(); System.out.println("获取值为bryant的key值:"+inverseMap.get("bryant")); } /** * 测试MapMaker */ public void testMapMaker(){ //MapMaker是对ConcurrentMap的建立,对传进来的Key进行一些列操作生成Value值 //当没有Put的时候,根据function传入的value值,计算出value值, //当有put的时候,对应的value值就是放入的value值 //线程安全,高并发性能,异步超时清理,自定义构建元素等强大功能于一身 ConcurrentMap<String, Integer> mapMaker = new MapMaker() //这一串暂时不知是啥意思,根据给出的例子是这么写的。只知道运用了Builder模式 // new MapMaker().weakKeys() // 指定Map保存的Key为WeakReference机制 // new MapMaker().weakValues() // 指定Map保存的Value为WeakReference机制 .concurrencyLevel(32).softKeys().weakValues().expiration(30, TimeUnit.MINUTES).makeComputingMap( new Function<String, Integer>() { @Override public Integer apply(String key) { return Integer.parseInt(key) + 100; } }); //如果沒有Put的时候,按照Function提供的算法 System.out.println("没有Put的情况下:"+mapMaker.get("111")); //如果有Put的情况下,按照指定的值赋予Value值 mapMaker.put("111", 123); System.out.println("有Put的情况下:"+mapMaker.get("111")); } public static void main(String[] args) { GoogleCollectionsDemo demo = new GoogleCollectionsDemo(); demo.testImmutableList(); demo.testMultiset(); demo.testMultimap(); demo.testBiMap(); demo.testMapMaker(); } }
运行结果:
JDK1.5方式:[james, bryant] Google Collections获取方式1:[james, bryant] Google Collections获取方式2:[james, bryant] 获取Multiset中的james个数:2 Multiset中的元素:[james x 2, bryant] 23号球员有:[james, jordan] 获取23Cel的值:james 获取值为bryant的key值:24Laker 没有Put的情况下:211 有Put的情况下:123
学习笔记:HttpClient的基本使用
之前公司要求做回报数据处理后结果发送给用户,用户端提供了一个Servlet用来接收数据。因此需要写一个基于Http协议的相关工具进行数据的传输,网上搜索了下,Java关于这方面的技术有两个:一是在JDK中的java.net包中已经提供了访问Http的基本功能,二是Apache Jakarta Common下的一个子项目开源API之HttpClient的子项目,提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包。我当然选择Apache的东西啦,于是搜索了相关材料,功能是实现了,不过对于这里面的一些东西还要加以再学习。
安装HttpClient 需要commons-codec-1.3.jar包、commons-httpclient-3.1.jar包、commons-logging-1.0.4.jar包
根据参考来的资料,自己写了一个基本的一个类,提供基本的功能,贴个代码:
/** * * <pre> * 关于Http协议进行操作,提供转发和访问网路地址的相关操作。 * </pre> * * @author 陈书挺 * @create 2010-7-23 * @version v1.0 * * <pre> * 修改时间 修改人 修改原因 * 2010-7-23 陈书挺 新建类 * </pre> * */ public class HttpOperator { //URL地址 private String url; /** * 根据URL参数创建构造函数<br> * 默认提交方式为POST提交方式 * @param url URL地址 */ public HttpOperator(String url){ this.url = url; } /** * 获取页面内容(页面代码),可指定提交方式<br> * 提交方式取值为: * SubmitMethod.GET :GET提交方式 * SubmitMethod.POST : POST 提交方式 * @param 提交方式 * @return 页面内容 * @throws IOException */ public String getPageContent(SubmitMethod submitMethod) throws IOException{ // 1.创建httpClient实例 HttpClient httpClient = new HttpClient(); if(submitMethod == SubmitMethod.GET){ //2.GetMethod会自动处理转发过程 GetMethod getMethod = new GetMethod(this.url); return this.getPageContentForGet(httpClient, getMethod); }else if(submitMethod == SubmitMethod.POST){ PostMethod postMethod = new PostMethod(this.url); return this.getPageContentForPost(httpClient, postMethod); }else{ return null; } } /** * 执行转发 可进行传参数key参数名,value指定参数值 * @param key 参数名 * @param value 参数值 * @return Http状态码 * @throws HttpException * @throws IOException */ public int executeForward(String key , String value) throws HttpException, IOException{ PostMethod postMethod = null; try{ HttpClient httpClient = new HttpClient(); postMethod = new PostMethod(url); postMethod.setParameter(key, value); int statusCode = httpClient.executeMethod(postMethod); return statusCode; }catch (Exception e){ throw new IOException(e); }finally{ postMethod.releaseConnection(); } } /** * 执行转发 可进行传参数集体参数map ,其中Map中的key指定参数名,value指定参数值 * @param map 参数Map对象 * @return Http状态码 * @throws HttpException * @throws IOException */ public int executeForwad(Map<String , String> map) throws HttpException, IOException{ NameValuePair [] nameValue = new NameValuePair[map.size()]; int k = 0; for(String key : map.keySet()){ nameValue[k].setName(key); nameValue[k++].setValue(map.get(key)); } return executeForward(nameValue); } /** * 执行转发 可进行传参数集体参数NameValuePair数组<br> * 其中NameValuePair对象封装了name 和value属性 * @param parameters NameValuePair对象 * @return Http状态码 * @throws HttpException * @throws IOException */ public int executeForward(NameValuePair[] parameters) throws HttpException, IOException { PostMethod postMethod = null; try { HttpClient httpClient = new HttpClient(); postMethod = new PostMethod(url); postMethod.setRequestBody(parameters); int statusCode = httpClient.executeMethod(postMethod); return statusCode; } catch (Exception e) { throw new IOException(e); } finally { postMethod.releaseConnection(); } } /** * 执行转发 将字节数组放入传输管道中进行传输数据 * @param data 要传输的数据 * @return Http状态码 * @throws HttpException * @throws IOException */ public int executeForward(byte[] data) throws HttpException, IOException { PostMethod postMethod = null; try { HttpClient httpClient = new HttpClient(); postMethod = new PostMethod(url); ByteArrayInputStream bis = new ByteArrayInputStream(data); InputStreamRequestEntity requestEntity = new InputStreamRequestEntity(bis); postMethod.setRequestEntity(requestEntity); int statusCode = httpClient.executeMethod(postMethod); return statusCode; } catch (Exception e) { throw new IOException(e); } finally { postMethod.releaseConnection(); } } /** * 执行转发 将字符串类型放入传输管道中进行传输数据 * @param data 要传输的数据 * @return Http状态码 * @throws HttpException * @throws IOException */ public int executeForward(String data) throws HttpException, IOException{ return executeForward(data.getBytes()); } /** * 执行转发 将输入流中的数据放入传输管道中进行传输数据 * @param inputStream 输入流 * @return Http状态码 * @throws HttpException * @throws IOException */ public int executeForward(InputStream inputStream) throws HttpException, IOException { PostMethod postMethod = null; try { HttpClient httpClient = new HttpClient(); postMethod = new PostMethod(url); InputStreamRequestEntity requestEntity = new InputStreamRequestEntity(inputStream); postMethod.setRequestEntity(requestEntity); int statusCode = httpClient.executeMethod(postMethod); return statusCode; } catch (Exception e) { throw new IOException(e); } finally { postMethod.releaseConnection(); } } /* * 使用GET方式获取页面内容 * @param httpClient HttpClient对象 * @param getMethod Get提交方式类 * @return 页面内容 * @throws IOException */ private String getPageContentForGet(HttpClient httpClient , GetMethod getMethod) throws IOException{ // 使用系统提供的默认恢复策略 重试3次 getMethod.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, new DefaultHttpMethodRetryHandler()); try { //3.调用httpClient实例来执行getMethod方法 //返回服务器返回的状态码 int statusCode = httpClient.executeMethod(getMethod); //如果执行成功 if(statusCode == HttpStatus.SC_OK){ //4.读取内容 byte [] responseBody = getMethod.getResponseBody(); return new String(responseBody); } } catch (HttpException e) { //1.协议不对 //2.返回内容不正常 //3.该异常是无法恢复的 throw new HttpException(e.getMessage()); } catch (IOException e) { //通常由于网络原因造成 //出现IO异常时候HttpClient会根据制定的恢复策略进行重试 //恢复策略可通过实现HttpMethodRetryHandler接口来实现 throw new IOException(e); } finally{ // 5.释放连接 getMethod.releaseConnection(); } return null; } /* * 使用POST方式获取页面内容 * @param httpClient HttpClient对象 * @param postMethod post提交方式类 * @return 页面内容 * @throws IOException */ private String getPageContentForPost(HttpClient httpClient , PostMethod postMethod) throws HttpException, IOException{ try{ int statusCode = httpClient.executeMethod(postMethod); if(statusCode == HttpStatus.SC_OK){ byte [] responseBody = postMethod.getResponseBody(); return new String(responseBody); } }catch(IOException e){ throw new IOException(e); }finally{ postMethod.releaseConnection(); } return null; } }
Log4j将日志输出到文件配置
今天,为了测试速度,很无奈的要去统计委托回报的数量。需要将日志输出到文件来统计。
得yoyo相助,得到如下配置可用:
log4j.appender.file=org.apache.log4j.FileAppender log4j.appender.file.File = D:/output.log #这里指定文件路径 log4j.appender.file.layout=org.apache.log4j.PatternLayout log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss}%l%m%n
另外需要注意
要设置 log4j.rootLogger=DEBUG, file
收集:Hibernate配置参数和说明
网上收到的一个关于Hibernate的配置参数问题,前几天遇到日志参数设置问题,搜索出来的东西,挺好的,收集了~~~
表一:Hibernate 参数配置 | |
参数 | 用途 |
hibernate.dialect | 一个Hibernate Dialect类名允许Hibernate针对特定的关系数据库生成优化的SQL. 取值 full.classname.of.Dialect |
hibernate.show_sql | 输出所有SQL语句到控制台. 有一个另外的选择是把org.hibernate.SQL这个log category设为debug。 eg. true | false |
hibernate.format_sql | 在log和console中打印出更漂亮的SQL。 取值 true | false |
hibernate.default_schema | 在生成的SQL中, 将给定的schema/tablespace附加于非全限定名的表名上. 取值 SCHEMA_NAME |
hibernate.default_catalog | 在生成的SQL中, 将给定的catalog附加于非全限定名的表名上. 取值 CATALOG_NAME |
hibernate.session_ factory_name |
SessionFactory创建后,将自动使用这个名字绑定到JNDI中. 取值 jndi/composite/name |
hibernate. max_fetch_depth |
为单向关联(一对一, 多对一)的外连接抓取(outer join fetch)树设置最大深度. 值为0意味着将关闭默认的外连接抓取. 取值 建议在0到3之间取值 |
hibernate.default_batch _fetch_size |
为Hibernate关联的批量抓取设置默认数量. 取值 建议的取值为4, 8, 和16 |
hibernate. default_entity_mode |
为由这个SessionFactory打开的所有Session指定默认的实体表现模式. 取值 dynamic-map, dom4j, pojo |
hibernate.order_updates | 强制Hibernate按照被更新数据的主键,为SQL更新排序。这么做将减少在高并发系统中事务的死锁。 取值 true | false |
hibernate. generate_statistics |
如果开启, Hibernate将收集有助于性能调节的统计数据. 取值 true | false |
hibernate. use_identifer_rollback |
如果开启, 在对象被删除时生成的标识属性将被重设为默认值. 取值 true | false |
hibernate.use_sql_ comments |
如果开启, Hibernate将在SQL中生成有助于调试的注释信息, 默认值为false. 取值 true | false |
表二:Hibernate JDBC和连接属性 | |
属性名 | 用途 |
hibernate.jdbc.fetch_size | 非零值,指定JDBC抓取数量的大小 (调用Statement.setFetchSize()). |
hibernate.jdbc.batch_size | 非零值,允许Hibernate使用JDBC2的批量更新. 取值 建议取5到30之间的值 |
hibernate.jdbc. batch_versioned_data |
如果你想让你的JDBC驱动从executeBatch()返回正确的行计数 , 那么将此属性设为true(开启这个选项通常是安全的). 同时,Hibernate将为自动版本化的数据使用批量DML. 默认值为false. eg. true | false |
hibernate.jdbc. factory_class |
选择一个自定义的Batcher. 多数应用程序不需要这个配置属性. eg. classname.of.Batcher |
hibernate.jdbc. use_scrollable_resultset |
允许Hibernate使用JDBC2的可滚动结果集. 只有在使用用户提供的JDBC连接时,这个选项才是必要的, 否则Hibernate会使用连接的元数据. 取值 true | false |
hibernate.jdbc. use_streams_for_binary |
在JDBC读写binary (二进制)或serializable (可序列化) 的类型时使用流(stream)(系统级属性). 取值 true | false |
hibernate.jdbc. use_get_generated_keys |
在数据插入数据库之后,允许使用JDBC3 PreparedStatement.getGeneratedKeys() 来获取数据库生成的key(键)。需要JDBC3+驱动和JRE1.4+, 如果你的数据库驱动在使用Hibernate的标 识生成器时遇到问题,请将此值设为false. 默认情况下将使用连接的元数据来判定驱动的能力. 取值 true|false |
hibernate.connection. provider_class |
自定义ConnectionProvider的类名, 此类用来向Hibernate提供JDBC连接. 取值 classname.of.ConnectionProvider |
hibernate.connection. isolation |
设置JDBC事务隔离级别. 查看java.sql.Connection来了解各个值的具体意义, 但请注意多数数据库都不支持所有的隔离级别. 取值 1, 2, 4, 8 |
hibernate.connection. autocommit |
允许被缓存的JDBC连接开启自动提交(autocommit) (不建议). 取值 true | false |
hibernate.connection. release_mode |
指定Hibernate在何时释放JDBC连接. 默认情况下,直到Session被显式关闭或被断开连接时,才会释放JDBC连接. 对于应用程序服务器的JTA数据源, 你应当使用after_statement, 这样在每次JDBC调用后,都会主动的释放连接. 对于非JTA的连接, 使用after_transaction在每个事务结束时释放连接是合理的. auto将为JTA和CMT事务策略选择after_statement, 为JDBC事务策略选择after_transaction. 取值 on_close | after_transaction | after_statement | auto |
hibernate.connection. <propertyName> |
将JDBC属性propertyName传递到DriverManager.getConnection()中去. |
hibernate.jndi. <propertyName> |
将属性propertyName传递到JNDI InitialContextFactory中去. |
表三:Hibernate缓存属性 | |
属性名 | 用途 |
hibernate.cache. provider_class |
自定义的CacheProvider的类名. 取值 classname.of.CacheProvider |
hibernate.cache. use_minimal_puts |
以频繁的读操作为代价, 优化二级缓存来最小化写操作. 在Hibernate3中,这个设置对的集群缓存非常有用, 对集群缓存的实现而言,默认是开启的. 取值 true|false |
hibernate.cache. use_query_cache |
允许查询缓存, 个别查询仍然需要被设置为可缓存的. 取值 true|false |
hibernate.cache. use_second_level_cache |
能用来完全禁止使用二级缓存. 对那些在类的映射定义中指定<cache>的类,会默认开启二级缓存. 取值 true|false |
hibernate.cache. query_cache_factory |
自定义实现QueryCache接口的类名, 默认为内建的StandardQueryCache. 取值 classname.of.QueryCache |
hibernate.cache. region_prefix |
二级缓存区域名的前缀. 取值 prefix |
hibernate.cache. use_structured_entries |
强制Hibernate以更人性化的格式将数据存入二级缓存. 取值 true|false |
表四:Hibernate事务属性 | |
属性名 | 用途 |
hibernate.transaction. factory_class |
一个TransactionFactory的类名, 用于Hibernate Transaction API (默认为JDBCTransactionFactory). 取值 classname.of.TransactionFactory |
jta.UserTransaction | 一个JNDI名字,被JTATransactionFactory用来从应用服务器获取JTA UserTransaction. 取值 jndi/composite/name |
hibernate.transaction. manager_lookup_class |
一个TransactionManagerLookup的类名 - 当使用JVM级缓存,或在JTA环境中使用hilo生成器的时候需要该类. 取值 classname.of.TransactionManagerLookup |
hibernate.transaction. flush_before_completion |
如果开启, session在事务完成后将被自动清洗(flush)。 现在更好的方法是使用自动session上下文管理。取值 true | false |
hibernate.transaction. auto_close_session |
如果开启, session在事务完成后将被自动关闭。 现在更好的方法是使用自动session上下文管理。取值 true | false |
表五:Hibernate其他属性 | |
属性名 | 用途 |
hibernate.current_ session_context_class |
为"当前" Session指定一个(自定义的)策略。eg. jta | thread | custom.Class |
hibernate.query. factory_class |
选择HQL解析器的实现. 取值 org.hibernate.hql.ast.ASTQueryTranslatorFactory or org.hibernate.hql.classic.ClassicQueryTranslatorFactory |
hibernate.query. substitutions |
将Hibernate查询中的符号映射到SQL查询中的符号 (符号可能是函数名或常量名字). 取值 hqlLiteral=SQL_LITERAL, hqlFunction=SQLFUNC |
hibernate.hbm2ddl.auto | 在SessionFactory创建时,自动检查数据库结构,或者将数据库schema的DDL导出到数据库. 使用 create-drop时,在显式关闭SessionFactory时,将drop掉数据库schema. 取值 validate | update | create | create-drop |
hibernate.cglib. use_reflection_optimizer |
开启CGLIB来替代运行时反射机制(系统级属性). 反射机制有时在除错时比较有用. 注意即使关闭这个优化, Hibernate还是需要CGLIB. 你不能在hibernate.cfg.xml中设置此属性. 取值 true | false |
表六:Hibernate SQL 方言 | |
RDBMS | 方言 |
DB2 | org.hibernate.dialect.DB2Dialect |
DB2 AS/400 | org.hibernate.dialect.DB2400Dialect |
DB2 OS390 | org.hibernate.dialect.DB2390Dialect |
PostgreSQL | org.hibernate.dialect.PostgreSQLDialect |
MySQL | org.hibernate.dialect.MySQLDialect |
MySQL with InnoDB | org.hibernate.dialect.MySQLInnoDBDialect |
MySQL with MyISAM | org.hibernate.dialect.MySQLMyISAMDialect |
Oracle (any version) | org.hibernate.dialect.OracleDialect |
Oracle 9i/10g | org.hibernate.dialect.Oracle9Dialect |
Sybase | org.hibernate.dialect.SybaseDialect |
Sybase Anywhere | org.hibernate.dialect.SybaseAnywhereDialect |
Microsoft SQL Server | org.hibernate.dialect.SQLServerDialect |
SAP DB | org.hibernate.dialect.SAPDBDialect |
Informix | org.hibernate.dialect.InformixDialect |
表七:Hibernate 日志级别 | |
类别 | 功能 |
org.hibernate.SQL | 在所有SQL DML语句被执行时为它们记录日志 |
org.hibernate.type | 为所有JDBC参数记录日志 |
org.hibernate.tool. hbm2ddl |
在所有SQL DDL语句执行时为它们记录日志 |
org.hibernate.pretty | 在session清洗(flush)时,为所有与其关联的实体(最多20个)的状态记录日志 |
org.hibernate.cache | 为所有二级缓存的活动记录日志 |
org.hibernate.transaction | 为事务相关的活动记录日志 |
org.hibernate.jdbc | 为所有JDBC资源的获取记录日志 |
org.hibernate.hql.AST | 在解析查询的时候,记录HQL和SQL的AST分析日志 |
org.hibernate.secure | 为JAAS认证请求做日志 |
org.hibernate | 为任何Hibernate相关信息做日志 (信息量较大, 但对查错非常有帮助) |
表八:JTA TransactionManagers | |
Transaction工厂类 | 应用程序服务器 |
org.hibernate.transaction. JBossTransaction ManagerLookup |
JBoss |
org.hibernate.transaction. WeblogicTransaction ManagerLookup |
Weblogic |
org.hibernate.transaction. WebSphereTransaction ManagerLookup |
WebSphere |
org.hibernate.transaction. WebSphereExtended JTATransactionLookup |
WebSphere 6 |
org.hibernate.transaction. OrionTransaction ManagerLookup |
Orion |
org.hibernate.transaction. ResinTransaction ManagerLookup |
Resin |
org.hibernate.transaction. JOTMTransaction ManagerLookup |
JOTM |
org.hibernate.transaction. JOnASTransaction ManagerLookup |
JOnAS |
org.hibernate.transaction. JRun4Transaction ManagerLookup |
JRun4 |
org.hibernate.transaction. BESTransaction ManagerLookup |
Borland ES |
出现Unable to find Bean with name XXX 可能原因
今天在公司做项目中,
由Ctrl层 >>> Biz层>>> Dao层 。在Ctrl注入Biz层类 ,在Biz层类注入Dao层类,使用注解的方式进行注入,例如,在Biz层注入Dao层的时候,首先需要将Dao层暴露出来,也就是将这个类标上 @Repository等注解,不然可能会出现Unable to find Bean with name的错误。原理实际上就是定义了一个Bean,没有定义的Bean使用注入自然是找不到这个Bean对象咯~~
换句话说若出现:Unable to find Bean with name 这种错误,不妨看看被注入类是否暴露给其他类咯~~也许是这个问题~
出现org.hibernate.hql.ast.QuerySyntaxException:XX is not mapped.错误可能原因
今天很郁闷的~~这个问题搞了许久,在单元测试一个Dao类的过程,出现如下错误
org.hibernate.hql.ast.QuerySyntaxException: XX is not mapped
XX是一个POJO,按照报错的语句说是,POJO没有被映射,于是,老在POJO上打转,结果是找不到原因。
问了榕哥~~3秒解决问题~原来在spring配置文件中的需要将这个对象的目录引进来,为了调整包结构,更改了目录结构,居然忘记改配置文件中的目录了~~汗~~
用了注解总是容易让人忘记配置啊。~
今天真郁闷~~发表备份下。
Hibernate:出现Not all named parameters have been set错误
初现 Not all named parameters have been set 错误。。
得榕哥帮助~~原来是查询语句参数少设置了~~
顺便悄悄改了同事写的代码~~
另外学到了一招,MyEclipse里面全局查找类快捷键:Ctrl+Shift+R
Spring中ApplicationContextAware接口用法
加载Spring配置文件时,如果Spring配置文件中所定义的Bean类,如果该类实现了ApplicationContextAware接口,那么在加载Spring配置文件时,会自动调用ApplicationContextAware接口中的
public void setApplicationContext(ApplicationContext context) throws BeansException
方法,并且自动可获得ApplicationContext 对象。前提必须在Spring配置文件中指定改类。
一个Demo程序如下:
Spring配置文件中配置:
<bean id="springContext" class="com.shine.spring.SpringContextHelper"></bean>
/** * ApplicationContext的帮助类 * 自动装载ApplicationContext * * @author ChenST * @create 2010-6-24 * */ public class SpringContextHelper implements ApplicationContextAware { private static ApplicationContext context ; /* * 注入ApplicationContext */ @Override public void setApplicationContext(ApplicationContext context) throws BeansException { //在加载Spring时自动获得context SpringContextHelper.context = context; System.out.println(SpringContextHelper.context); } public static Object getBean(String beanName){ return context.getBean(beanName); } }
使用pdfBox读取PDF文件注意问题
本来想要iText来读取pdf的,结果网上搜索下得出结论,使用iText读取pdf基本上是无法实现的。
于是还是改用了pdfBox来读取文件。于是造成了iText与pdfBox混用的尴尬。
虽然如此,但也遇到了不少问题。下面分析遇到的问题。
---------------------------------------------------------------------------------
1.首先最好要下载pdfbox 1.1的版本。处理文档方面比较完善,如果是低版本的话,是不支持字体与语言的读取。会报错。
2.另外还要下载fontbox 1.1 的包,这对多种字体以及多种语言的支持。注意版本,不然会报有一些类找不到。
3.还要加入common-loggin的包,不然进行读取的时候会遇到类找不到异常,主要是用到org.apache.commons.logging.LogFactory类
---------------------------------------------------------------------------------
遇到的问题主要是使用的包版本太对,或者两者的版本不匹配造成的。
贴个使用pdfbox来读取pdf文档内容的代码:
/** * 读取指定路径的pdf文件的文本内容<br> * @param filePath 指定路径 * @return pdf文件的文本内容 * @throws IOException */ public String readPdf(String filePath) throws IOException{ File file = new File(filePath); FileInputStream fis = new FileInputStream(file); //创建一个PDF解析器 PDFParser parser = new PDFParser(fis); //进行解析 parser.parse(); //得到PDF文档对象 PDDocument document = parser.getPDDocument(); //新建一个PDF文件剥离器 PDFTextStripper stripper = new PDFTextStripper(); //从文档对象中剥离文本 String content = stripper.getText(document); fis.close(); document.close(); return content;