Hibernate是比较成熟的技术了,无论是读书,还是网上的文章都很丰富,在这里只列出项目开发中有关hibernate的技巧和问题的解决方法
- 字段名或表名为SQL关键字:
如果表名或字段名使用了SQL的关键字那会hibernate生成的sql语句在执行时会出错,如:
“在关键字 'key' 附近有语法错误”
这种问题本不应该出现,应尽量避免使用SQL的关键字做为自定义的名称,出现这种情况最好就是改掉库中使用关键字做表名或字段名的名称。但是有时因为各种原因无法更改时怎么办呢!其实MSSQL中即有自已的解决办法,那就是加包括号([]),所以在使用hibernate时如果遇到这种情况只要修改一下相印的hbm.xml 文件里对印的数据库字段名就好了,例如
- <property name="key" type="java.lang.String">
- <column name="[Key]" length="50" not-null="true" />
- </property>
2. 关与hibernate的seccionfactory和惰性加载
如果使用了Hibernate 的惰性加载并使用了sping来代理DAO类那么在惰性加载时可能出现以下错误
org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: cn.com.netgen.model.Student.courses - no session or session was closed
org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationException
是因为在spring 要求惰性加载数据时hibernate的seccion已经关闭了,在这种情况下可以使用springr 的OpenSessionInViewFilter
有关内容参见(http://blog.youkuaiyun.com/fooe84/archive/2006/04/27/680449.aspx)
在你的xml内加入这个过滤器,如果你同我一样未使用的默认的seccionfactory名那么还要给出seccfactory的名子如:
- <filter>
- <filter-name>hibernateFilter</filter-name>
- <filter-class>
- org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
- </filter-class>
- <init-param>
- <param-name>sessionFactoryBeanName</param-name>
- <param-value>sessionFactoryInfo</param-value>
- </init-param>
- </filter>
- <filter-mapping>
- <filter-name>hibernateFilter</filter-name>
- <url-pattern>/*</url-pattern>
- </filter-mapping>
注:这里有个问题我的项目中使用了多个数据库,那么要怎么设置,设置两个OpenSessionInViewFilter过滤器分别使用不同的seccionFactory可以吗,有待试验!
3.使hibernate连接多个数据库
连接多个库的问题除了上述的OpenSessionInViewFilter问题,还有一个问题 就是如果两个库中存在相同的表怎样处理。