1.No row with the given identifier exists 解决方法
有两张表,a和b.产生此问题的原因就是a里做了关联<one-to-one>或者<many-to-one unique="true">(特殊的多对一映射,实际就是一对一)来关联b.当hibernate查找的时候,b里的数据没有与a相匹配的,这样就会报No row with the given identifier exists这个错.(一句话,就是数据的问题!)
假如说,a里有自身的主键id1,还有b的主键id2,这两个字段.
如果hibenrate设置的单项关联,即使a中的id2为null值,b中id2中有值,查询都不会出错.但是如果a中的id2字段有值,但是这个值在b中主键值里并没有,就会报上面的错!
如果hibernate是双向关联,那么a中的id2为null值,但是b中如果有值,就会报这个错.这种情况目前的解决办法就是改成单项关联,或者把不对应的数据改对!
hibernate的查询有很多,Query,find,Criteria,get,load
query使用hsql语句,可以设置参数是常用的一种方式
criteria的方式,尽量避免了写hql语句,看起来更面向对象了。
find方式,这种方式已经被新的hibernate丢弃
get和load方式是根据id取得一个记录
下边详细说一下get和load的不同,因为有些时候为了对比也会把find加进来。
1,从返回结果上对比:
load方式检索不到的话会抛出org.hibernate.ObjectNotFoundException异常
get方法检索不到的话会返回null
2,从检索执行机制上对比:
get方法和find方法都是直接从数据库中检索
而load方法的执行则比较复杂
1,首先查找session的persistent Context中是否有缓存,如果有则直接返回
2,如果没有则判断是否是lazy,如果不是直接访问数据库检索,查到记录返回,查不到抛出异常
3,如果是lazy则需要建立代理对象,对象的initialized属性为false,target属性为null
4, 在访问获得的代理对象的属性时,检索数据库,如果找到记录则把该记录的对象复制到代理对象的target
上,并将initialized=true,如果找不到就抛出异常
自关联一对多的时候。在many-to-one里面添加not-found=“ignore”
2.struts的异常处理
A.内部处理异理<Exception key=”资源文件里面的key” type=”异常处理类”>
例如:<Exception key=”error” type=”java.lang.RuntimeEcxeption” scope=”request”(异常文件存入request中)>
在程序中throws异常
B.全局异常处理
自定义异常类继承RuntimeException获得异常对象,实现父类的所以构造器,对其传入的参数设置getter方法
自定义异常处理类Handler继承org.apache.struts.action.ExceptionHandler;
复写execute方法,用来捕获异常,放到session或request中
编程式异常:在程序中自己捕获异常,跳转到异常页面
LOG4J日志管理
三大概念
Logger—使用这个对象来进行输出
Appender—使用这个对象来定义输出到哪里去
Layout—使用这个对象来定义输出格式
LOG4J的级别(level)
debug<info<warn<error<fatal
jsp文本域read-only不能改,但后台可以得到
如果设成disabled的话,后台的不到其值
3.程序代码出现cannot be resolved.
出現以上訊息的原因是因為你裝了多個版本的jre或jdk的關係。本來Eclipse在建立專案時,會自動參照你的jre路徑,但多個版本就沒辦法了。
你只能手動建立…
1. 進入window\preferences\java\Installed JREs
1)按Add
2)輸入JRE Name, 例JDK1.5.0.03
3)JRE home directory, 選擇安裝的路徑
4)按OK
2. 進入Project\properties\Java Bulid Path
1)Add library
2)選JRE System Library後按Next
3)選workplace default JRE後按finish...
4.Hibernian映射关系
实体类class映射---成表
普通属性property映射—成表字段
5.数据库编码设置
修改整个数据库服务器
在my.cf文件的[mysqld]段设置:
default-character-set=utf8
单独设置某个数据库:
alter database testdb character set utf8;
查看mysql支持的编码:
show character set;
6.struts的异常处理机制
编程式异常
7.用freemarker遇见的异
8.DAO
业务逻辑层处理对象之间的关系
Dao层尽量只跟单一的对象打交道,不要去维护对象之间的关系,这些关系交割manager层完成
8.出现按住ctrl键不进入源码解决
右键检出的项目,-->Properties-->Java Build Path-->Source-->删掉原有的src,在Add Folder中添加新的src-->在Libaries中添加项目使用的所有jar包。
之后就可以了