Java异常总结

1.JPA使用实体管理器EntityManager执行find方法时错误

java.lang.IllegalArgumentException: id to load is required for loading

原因:方法entityManager.find(entityClass, primaryKey)的两个参数不能为空,如果查询的主键ID为空则抛出该异常,

如果ID不为空而在数据库找不到对应的列时函数执行正常返回NULL。

与其他人的错误原因稍有不同,参见:id to load is required for loading

 

2.实体管理器保存(persist)游离(脱管)对象时发生错误

org.hibernate.PersistentObjectException: detached entity passed to persist

参见:JPA异常:org.hibernate.PersistentObjectException: detached entity passed to persist

同样奇怪的是我的错误原因与网上说的不同。

将一个实体由数据库取出后如果此时提交了事务,无论 EntityTransaction.commit()

EntityManager.setFlushMode(FlushMode.commit)EntityManager.close() 都将导致该实体脱离实体管理器的管理,

成为一个游离()对象,此时如果重新开启事务并试图再将该对象保存到数据库中,如 EntityManager.persist() 都将导致该异常抛出。


3.没有开启数据库时使用无法实例化JPA实体管理器时的错误

'hibernate.dialect' must be set when no Connection avalable

参见:http://bbs.csdn.net/topics/330006556

hql只有在连接可用的情况下才能设置,hibernate.dialect=org.hibernate.dialect.XXXDialect 位置应该

放到 hibernate.show_sql=true 之前,在persistence.xml中设置该行之后还是会报异常的:

Could not open JPA EntityManager for transaction; nested exception is javax.persistence.PersistenceException: org.hibernate.exception.JDBCConnectionException: Cannot open connection

但至少该异常明确的指出是没有打开数据库连接所致的错误。


4.在没有struts过滤的页面中使用struts标签的错误

The Struts dispatcher cannot be found.  This is usually caused by using Struts tags without the associated filter. Struts tags are only usable when the request has passed through its servlet filter, which initializes the Struts dispatcher needed for this tag

如果一个jsp页面中包含有struts2的标签,那请求信息应该要经过Struts2的FilterDispatcher。个人觉得这点非常不方便,尤其是如果自定义Jsp Filter的话,那会有一大堆没办法解决的问题。

参见:Struts2标签问题-using Struts tags without the associat


5.使用JPA去除懒加载对象时错误

could not initialize proxy - no Session

原因:由于对多对一(ManyToOne)级联的某一个对象设置了懒加载(fetch=FetchType.LAZY),

而在使用实体管理器(EntityManager)取出该对象后立即提交(commit)了实体事务(EntityTransaction),

因此此时在想取出该级联对象时将会抛出此异常。由于使用了Spring对JPA事务进行管理,

EntityManager对象是使用 PersistenceContext(unitName="") 自动注入的,

因此取出托管对象后就立即由Spring自动关闭了事务,不能再进行后续查询操作。

设置lazy="false" 解决了大部分的延时加载问题,但是同时也降低了系统的性能。
参见: Hibernate3 错误: could not initialize proxy - no Session

 

6.使用Spring管理JPA事务时为其添加提交级别时出错

org.springframework.transaction.InvalidIsolationLevelException: Standard JPA does not support custom isolation levels - use a special JpaDialect for your JPA implementation

在一个使用自动注入JPA实体管理器的Spring bean业务方法中

@PersistenceContext
private EntityManager entityManager;

 添加了如下事务控制:

@Transactional(noRollbackFor = NoResultException.class, readOnly = true, isolation = Isolation.SERIALIZABLE)

由于希望使事务提交级别具备更高的安全性,因而使用了“串行化”隔离级别。但是JPA并不支持隔离级别的设置,因此报错。

 

7.dom4j编码错误

org.dom4j.DocumentException: Invalid byte 1 of 1-byte UTF-8 sequence. Nested exception: Invalid byte 1 of 1-byte UTF-8 sequence.

原因是读取的xml文档是ANSI编码的,而在保存时设置了OutputFormat的编码为UTF-8:

outputFormat.setEncoding("UTF-8");

 用记事本打开xml文档另存为UTF-8就OK了!

参考:Dom4j中的中文编码问题


8.JavaMail包冲突错误

java.lang.NoClassDefFoundError: com/sun/mail/util/LineInputStream

 参考:http://blog.csdn.net/liuyxit/article/details/5193802

原因: MyEclipse6.5的javaee.jar中的mail包与JavaMail.jar包有冲突。

解决: 使用最新的javaee.jar包,或将旧版jar包中的的mail目录删除后,加入mail.jar和activition.jar

下载:http://java.sun.com/products/javamail/downloads/index.html

 

9.Spring2.5集成JPA运行时出错

Specified field type [interface javax.persistence.EntityManager] is incompatible with resource type [javax.persistence.EntityManagerFactory]

参考:http://blog.csdn.net/jianw2007/article/details/5218865

//在一个Service类中
@PersistenceUnit EntityManager em;
//应该改为
@PersistenceContext EntityManager em;


10.Struts2.2.1依赖包缺少错误

严重: Dispatcher initialization failed
Unable to load configuration. - bean - jar:file:/D:/Document/Workspaces/.metadata/.plugins/com.genuitec.eclipse.easie.tomcat.myeclipse/tomcat/webapps/struts/WEB-INF/lib/struts2-core-2.2.1.jar!/struts-default.xml:48:178

  • commons-fileupload-1.2.1.jar
  • commons-logging-1.0.4.jar
  • commons-io-1.3.2.jar
  • ognl-3.0.jar
  • xwork-core-2.2.1.jar
  • struts2-core-2.2.1.jar
  • freemarker-2.3.16.jar
  • javassist-3.7.ga.jar (缺少该包导致)


11.JPA Identity字段手工设置值

javax.persistence.PersistenceException: org.hibernate.PersistentObjectException: detached entity passed to persist: com.jpa.bean.Person

错误原因可能是,对标记为@Id和@GeneratedValue的字段,调用其setXXX方法然后再执行 entityManager.persist()持久化方法,

此时JPA会判断该字段是自增长的,不能显示设置,因此报错;另一种可能是,手工将数据库中该表的自增属性去掉。

参考:http://zjt112g.iteye.com/blog/262800

你可能感兴趣的:(java)