[英]Java & Hibernate - Session Management while using Interface
我的以下代码有问题,请寻求帮助。 在使用Hibernate的服务层中,我正在使用批注来管理会话,这非常正常。
@Override
@Transactional
public Response delete(Integer id) throws Exception {
Response response = new Response();
try {
response.setData(videoDao.delete(id));
} catch (Exception e) {
e.printStackTrace();
}
return response;
}
在DAO层中调用以下方法
@Override
public boolean delete(int id) throws Exception {
String query = "UPDATE " + this.entity +
" SET remove_date = '" + String.valueOf(new Date(0)) + "'" +
" WHERE id = " + id;
Query q = sessionFactory.getCurrentSession().createQuery(query);
return q.executeUpdate() > 0 ? true : false;
}
其中videoDao是实现接口的实体的Dao层。 到现在为止还挺好。
问题是当我在videoDao中有另一个方法不在我正在实现的接口中时,在这种情况下,注释不起作用,但是我不知道如何在服务层中管理sessionFactory。 我认为使用接口中的方法时不会出现问题,因为Spring正在注入包括sessionFactory的距离,但是如果我手动进行(因为我不能使用注入的对象,因为它是接口而不是接口具有此方法的实际类)sessionFactory始终为null。
public interface IDao {
public boolean delete(int id) throws Exception;
}
这是我在服务层中使用接口定义dao的方式:
@Autowired
IDao videoDao;
总结一下我对所需内容的理解-您想让Spring代理类中定义的方法,而不是该类实现的接口中定义的方法。
根据上述假设,您观察到的行为与Spring AOP代理生成一致。
Spring AOP代理生成默认情况下使用:
如果目标类实现了至少一个接口,则JDK动态代理。
如果目标类未实现任何接口,则CGLIB进行代理。
因此,对于JDK代理,Spring AOP使用目标接口来查找需要代理的方法。 而且,Spring JDK代理仅实现接口中定义的方法。 因此,如果有任何直接在目标类中定义但不在接口中定义的方法,则这些方法将不会被代理,这就是您要观察的行为。
使用CGLIB选项,仅当目标类未实现任何接口时,Spring才会生成CGLIB代理。 此CGLIB代理扩展了目标类,因此代理了目标类中的方法。
这是默认行为。
但是,如果我们想通知Spring甚至为基于接口的目标类生成CGLIB代理,我们可以通过使用proxy-target-class=true
或proxyTargetClass
属性来实现。 使用此Spring AOP代理,可以在类中定义方法,而不用查看接口,我想这就是您要寻找的。
正如您已经指出的那样,要实现此目的,我们需要在代码中使用/注入类,而不是在接口中使用,尽管这不是最佳实践。
您可以在http://docs.spring.io/spring/docs/4.3.0.BUILD-SNAPSHOT/spring-framework-reference/htmlsingle/#aop-proxying和http:// docs中找到有关此主题的更多信息。 spring.io/spring/docs/4.3.0.BUILD-SNAPSHOT/spring-framework-reference/html单/#transaction
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.