我正在一个项目工作,我想更新从基于xml的配置到基于注释。我在服务层成功完成了这项工作,但是DAO层遇到了麻烦。我有扩展BaseDAO的DAO类,这个BaseDAO扩展了HibernateDaoSupport。我想用@Repository注释DAO类,并将组件扫描添加到我的context.xml。我认为这个问题与我的DAO对BaseDAO的继承有关? 这是我目前无法解决问题的代码
@Repository ("userDAO")
public class UserDAOImpl extends BaseDAO implements IUserDAO {
@Override
public Integer saveUser(UserVO user) {
user.setDateCreated(MyDateUtils.getCurrentDate());
user.setDateUpdated(MyDateUtils.getCurrentDate());
Integer userId = performSave(user);
return userId;
}
这是我的BaseDAO
public class BaseDAO extends HibernateDaoSupport {
public Integer performSave(Object object) {
Integer id = null;
try {
id = (Integer) getHibernateTemplate().save(object);
} catch (DataAccessException e) {
}
return id;
}
这是BaseDAO的 在我的context.xml中我使用 - 这是UserDAO(可行)的旧配置 所以更清楚一点,我摆脱了UserDAO的这个xml bean定义并使用了@Repository但它停止了工作并抛出了java.lang.IllegalArgumentException:&#39; sessionFactory&#39;或者&#39; hibernateTemplate&#39;是必需的<bean id="baseDAO" class="com.my.dao.database.base.BaseDAO"
abstract="true">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<bean id="sessionFactory"
class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="MyDataSource" />
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">${hibernate.dialect}</prop>
<prop key="hibernate.show_sql">${hibernate.showSQL}</prop>
</props>
</property>
<property name="annotatedClasses">
<list>
<value>com.my.domain.dao.UserVO</value>
</list>
</property>
</bean>
<bean id="userDAO" class="com.my.dao.database.impl.UserDAOImpl"
parent="baseDAO" />
答案 0 :(得分:0)
您必须在DaoImpl类中使用@Autowire标记sessionFactory。
答案 1 :(得分:0)
我认为这个问题是关于同样的问题:
Spring 3 Annotations - HibernateDaoSupport - Repository Requires Session Factory
我分享了选定的答案:
HibernateDaoSupport
通过SessionFactory
随setSessionFactory()
提供。但是,setSessionFactory()
为final
,因此您无法覆盖它以添加@Autowired
注释。但您可以将@Autowired
应用于任意方法并从中调用setSessionFactory()
:
@Autowired
public void init(SessionFactory factory) {
setSessionFactory(factory);
}
希望有所帮助
详细说明:
向DAO提供SessionFactory的原始方法不会从IoC容器中获取de SessionFactory,因为没有@Autowired。
您可以添加它来创建一个覆盖该方法的子类,并且具有注释,但是因为该方法是最终的,所以不能。
因此,由于您无法自动为setter提供依赖项,因此您唯一的方法是手动执行。上面的方法包含了SessionFactory的注释。要在创建DAO时调用它,可以使用@PostConstruct:
@PostConstruct
@Autowired
public void init(SessionFactory factory) {
setSessionFactory(factory);
}