Code Bye

hibernate proxy异常

背景:最近搭建struts2,spring4,hibernate 4 的框架。
问题:查询用户fetch=join部门不报错,使用代理延迟加载就报错(我做登陆校验用户密码时,不需要加载部门)。
配置:



@Entity
@Table(name = "T_USER")
public class User {
....
....
	@ManyToOne
	@LazyToOne(LazyToOneOption.RROXY)
	public Department getDept() {
		return dept;
	}

	public void setDept(Department dept) {
		this.dept = dept;
	}

}

异常:

Caused by: java.lang.ClassCastException: com.jst.myjstBase.model.Department_$$_javassist_0 cannot be cast to javassist.util.proxy.Proxy
	at org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.getProxy(JavassistLazyInitializer.java:147)
	at org.hibernate.proxy.pojo.javassist.JavassistProxyFactory.getProxy(JavassistProxyFactory.java:75)
	at org.hibernate.tuple.entity.AbstractEntityTuplizer.createProxy(AbstractEntityTuplizer.java:771)
	at org.hibernate.persister.entity.AbstractEntityPersister.createProxy(AbstractEntityPersister.java:4613)
	at org.hibernate.event.internal.DefaultLoadEventListener.createProxyIfNecessary(DefaultLoadEventListener.java:349)
	at org.hibernate.event.internal.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:270)
	at org.hibernate.event.internal.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:150)
	at org.hibernate.internal.SessionImpl.fireLoad(SessionImpl.java:1070)
	at org.hibernate.internal.SessionImpl.internalLoad(SessionImpl.java:989)
	at org.hibernate.type.EntityType.resolveIdentifier(EntityType.java:716)
	at org.hibernate.type.EntityType.resolve(EntityType.java:502)
	at org.hibernate.engine.internal.TwoPhaseLoad.doInitializeEntity(TwoPhaseLoad.java:170)
	at org.hibernate.engine.internal.TwoPhaseLoad.initializeEntity(TwoPhaseLoad.java:144)
	at org.hibernate.loader.Loader.initializeEntitiesAndCollections(Loader.java:1114)
	at org.hibernate.loader.Loader.processResultSet(Loader.java:972)
	at org.hibernate.loader.Loader.doQuery(Loader.java:920)
	at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:354)
	at org.hibernate.loader.Loader.doList(Loader.java:2553)
	at org.hibernate.loader.Loader.doList(Loader.java:2539)
	at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2369)
	at org.hibernate.loader.Loader.list(Loader.java:2364)
	at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:496)
	at org.hibernate.hql.internal.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:387)
	at org.hibernate.engine.query.spi.HQLQueryPlan.performList(HQLQueryPlan.java:231)
	at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1264)
	at org.hibernate.internal.QueryImpl.list(QueryImpl.java:103)
	at com.jst.myjstBase.DAO.impl.UserDAOImpl.findUserByLoginName(UserDAOImpl.java:24)
	at com.jst.myjstBase.service.impl.UserServiceImpl.findUserByLoginName(UserServiceImpl.java:22)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:317)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
	at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:98)
	at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:262)
	at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:95)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
	at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
	at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207)
	at $Proxy20.findUserByLoginName(Unknown Source)
	at com.jst.common.service.impl.ShiroDbRealm.doGetAuthenticationInfo(ShiroDbRealm.java:54)
	at org.apache.shiro.realm.AuthenticatingRealm.getAuthenticationInfo(AuthenticatingRealm.java:568)
	at org.apache.shiro.authc.pam.ModularRealmAuthenticator.doSingleRealmAuthentication(ModularRealmAuthenticator.java:180)
	at org.apache.shiro.authc.pam.ModularRealmAuthenticator.doAuthenticate(ModularRealmAuthenticator.java:267)
	at org.apache.shiro.authc.AbstractAuthenticator.authenticate(AbstractAuthenticator.java:198)
	... 95 more

50分
类匹配错误,是不是代理找错类了
去掉@LazyToOne(LazyToOneOption.PROXY)可以运行,但会把 部门的信息left out join出来。

50分
用的都是什么包 看下,应该存在多个包都包含注解类LazyToOne,最后转型错误。
使用hibernate4自带的required里的lib即可。
可以用
@ManyToOne(fetch=FetchType.EAGER)
	@JoinColumn(name="dept_id")
	public Department getDept() {
		return dept;
	}

不可以用,报错

@ManyToOne(fetch=FetchType.LAZY)
	@JoinColumn(name="dept_id")
	public Department getDept() {
		return dept;
	}
引用 4 楼 javaee_ssh 的回复:

可以用

@ManyToOne(fetch=FetchType.EAGER)
	@JoinColumn(name="dept_id")
	public Department getDept() {
		return dept;
	}

不可以用,报错

@ManyToOne(fetch=FetchType.LAZY)
	@JoinColumn(name="dept_id")
	public Department getDept() {
		return dept;
	}

我记得以前报过这个错,是因为spring事务配置的问题

弄了两个javassist.jar真是惭愧,删除了低版本的,系统正常,谢谢大家,散分。

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明hibernate proxy异常