SSH整合的BaseDaoImpl.java

import java.io.Serializable;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.List;


import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Projections;
import org.springframework.orm.hibernate5.support.HibernateDaoSupport;


public class BaseDaoImpl<T> extends HibernateDaoSupport implements BaseDao<T> {


	private Class clazz;//用于接收运行期泛型类型
	
	
	public BaseDaoImpl() {
		//获得当前类型的带有泛型类型的父类
		ParameterizedType ptClass = (ParameterizedType) this.getClass().getGenericSuperclass();
		//获得运行期的泛型类型
		clazz = (Class) ptClass.getActualTypeArguments()[0];
	}


	@Override
	public void save(T t) {
		getHibernateTemplate().save(t);
	}


	@Override
	public void delete(T t) {
		
		getHibernateTemplate().delete(t);
		
	}


	@Override
	public void delete(Serializable id) {
		T t = this.getById(id);//先取,再删
		getHibernateTemplate().delete(t);
	}


	@Override
	public void update(T t) {
		getHibernateTemplate().update(t);
	}


	@Override
	public T getById(Serializable id) {
		
		
		
		return (T) getHibernateTemplate().get(clazz, id);
	}


	@Override
	public Integer getTotalCount(DetachedCriteria dc) {
		//设置查询的聚合函数,总记录数
		dc.setProjection(Projections.rowCount());
		
		List<Long> list = (List<Long>) getHibernateTemplate().findByCriteria(dc);
		
		//清空之前设置的聚合函数
		dc.setProjection(null);
		
		if(list!=null && list.size()>0){
			Long count = list.get(0);
			return count.intValue();
		}else{
			return null;
		}
		
	}


	@Override
	public List<T> getPageList(DetachedCriteria dc, Integer start, Integer pageSize) {
		
		List<T> list = (List<T>) getHibernateTemplate().findByCriteria(dc, start, pageSize);
		
		return list;
	}


}

java.lang.IllegalArgumentException: id to load is required for loading at org.hibernate.event.spi.LoadEvent.<init>(LoadEvent.java:93) at org.hibernate.event.spi.LoadEvent.<init>(LoadEvent.java:63) at org.hibernate.internal.SessionImpl$IdentifierLoadAccessImpl.doLoad(SessionImpl.java:2878) at org.hibernate.internal.SessionImpl$IdentifierLoadAccessImpl.load(SessionImpl.java:2855) at org.hibernate.internal.SessionImpl.get(SessionImpl.java:1093) at com.supcon.orchid.orm.dao.hibernate.BaseDaoImpl.get(BaseDaoImpl.java:112) at com.supcon.orchid.foundation.internal.services.UserServiceImpl.load(UserServiceImpl.java:708) at com.supcon.orchid.foundation.internal.services.UserServiceImpl.load(UserServiceImpl.java:54) at com.supcon.orchid.foundation.internal.services.UserServiceImpl$$FastClassBySpringCGLIB$$360bd70e.invoke(<generated>) at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:749) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:295) at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:98) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:688) at com.supcon.orchid.foundation.internal.services.UserServiceImpl$$EnhancerBySpringCGLIB$$1413c4a8.load(<generated>) at org.jbpm.pvm.internal.history.model.HistoryAutomaticInstanceImpl.<init>(HistoryAutomaticInstanceImpl.java:68) at org.jbpm.pvm.internal.history.events.AutomaticEnd.createHistoryActivityInstance(AutomaticEnd.java:39) at org.jbpm.pvm.internal.history.events.ActivityStart.process(ActivityStart.java:63) at org.jbpm.pvm.internal.history.HistorySessionImpl.process(HistorySessionImpl.java:32) at org.jbpm.pvm.internal.history.HistoryEvent.fire(HistoryEvent.java:67) at org.jbpm.pvm.internal.model.ExecutionImpl.historyAutomatic(ExecutionImpl.java:1386) at com.supcon.orchid.workflow.engine.internal.activity.StartActivity.execute(StartActivity.java:42) at org.jbpm.pvm.internal.model.op.ExecuteActivity.perform(ExecuteActivity.java:64) at org.jbpm.pvm.internal.model.ExecutionImpl.performAtomicOperationSync(ExecutionImpl.java:896) at org.jbpm.pvm.internal.model.ExecutionImpl.performAtomicOperation(ExecutionImpl.java:856) at org.jbpm.pvm.internal.model.ExecutionImpl.start(ExecutionImpl.java:401) at org.jbpm.pvm.internal.cmd.StartProcessInstanceCmd.execute(StartProcessInstanceCmd.java:101) at org.jbpm.pvm.internal.cmd.StartProcessInstanceCmd.execute(StartProcessInstanceCmd.java:39) at org.jbpm.pvm.internal.svc.DefaultCommandService.execute(DefaultCommandService.java:43) at org.jbpm.pvm.internal.tx.SpringCommandCallback.doInTransaction(SpringCommandCallback.java:46) at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:140) at org.jbpm.pvm.internal.tx.SpringTransactionInterceptor.execute(SpringTransactionInterceptor.java:51) at org.jbpm.pvm.internal.svc.EnvironmentInterceptor.executeInNewEnvironment(EnvironmentInterceptor.java:55) at org.jbpm.pvm.internal.svc.EnvironmentInterceptor.execute(EnvironmentInterceptor.java:42) at org.jbpm.pvm.internal.svc.RetryInterceptor.execute(RetryInterceptor.java:58) at org.jbpm.pvm.internal.svc.ExecutionServiceImpl.startProcessInstanceById(ExecutionServiceImpl.java:45) at com.supcon.orchid.workflow.engine.services.impl.InstanceServiceImpl.start(InstanceServiceImpl.java:101) at com.supcon.orchid.workflow.engine.services.impl.InstanceServiceImpl$$FastClassBySpringCGLIB$$54065527.invoke(<generated>) at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)
最新发布
08-21
这个异常 `java.lang.IllegalArgumentException: id to load is required for loading` 是 Hibernate 框架抛出的,表示在尝试加载某个实体对象时没有提供必要的 ID。Hibernate 需要实体的主键(ID)来从数据库中加载对应的数据。 --- ### 原因分析 1. **调用 `Session.get()` 或 `Session.load()` 时未传入有效的 ID**: Hibernate 的 `get()` 和 `load()` 方法都需要一个主键作为参数,用于定位数据库中的记录。如果传入的 ID 为 `null` 或者无效值(例如 0),就会抛出此异常。 2. **业务逻辑中未正确设置 ID**: 在某些业务代码中(如 `UserServiceImpl.load()` 方法),可能没有正确获取或传递 ID 值。 3. **数据传输错误**: 如果 ID 是从前端传递过来的,可能在解析、转换过程中出错,导致 ID 变为 `null` 或 0。 --- ### 解决方案 #### 1. 检查调用 `session.get()` 或 `session.load()` 的地方 确保传入的 ID 不为 `null`,且是有效的主键值。 ```java User user = session.get(User.class, userId); ``` 其中 `userId` 必须是一个非空、有效的主键值。 #### 2. 在业务代码中添加空值判断 例如在 `UserServiceImpl` 中的 `load` 方法中添加判断: ```java public User load(Long userId) { if (userId == null || userId <= 0) { throw new IllegalArgumentException("User ID 不能为空或无效值"); } return baseDao.get(User.class, userId); } ``` #### 3. 日志打印和调试 在出错的调用链路中(如 `HistoryAutomaticInstanceImpl` 或 `StartActivity`)打印传入的 ID 值,确认是否为空或无效。 --- ### 示例修复代码 假设我们修复 `UserServiceImpl` 的 `load` 方法: ```java public User load(Long userId) { if (userId == null || userId <= 0) { // 记录日志或抛出自定义异常 logger.error("Attempted to load user with invalid ID: {}", userId); throw new IllegalArgumentException("用户ID不能为空或无效值"); } return baseDao.get(User.class, userId); } ``` --- ### 相关问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值