繁体   English   中英

Java和Hibernate-使用接口时的会话管理

[英]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代理生成默认情况下使用:

  1. 如果目标类实现了至少一个接口,则JDK动态代理。

  2. 如果目标类未实现任何接口,则CGLIB进行代理。

因此,对于JDK代理,Spring AOP使用目标接口来查找需要代理的方法。 而且,Spring JDK代理仅实现接口中定义的方法。 因此,如果有任何直接在目标类中定义但不在接口中定义的方法,则这些方法将不会被代理,这就是您要观察的行为。

使用CGLIB选项,仅当目标类未实现任何接口时,Spring才会生成CGLIB代理。 此CGLIB代理扩展了目标类,因此代理了目标类中的方法。

这是默认行为。

但是,如果我们想通知Spring甚至为基于接口的目标类生成CGLIB代理,我们可以通过使用proxy-target-class=trueproxyTargetClass属性来实现。 使用此Spring AOP代理,可以在类中定义方法,而不用查看接口,我想这就是您要寻找的。

正如您已经指出的那样,要实现此目的,我们需要在代码中使用/注入类,而不是在接口中使用,尽管这不是最佳实践。

您可以在http://docs.spring.io/spring/docs/4.3.0.BUILD-SNAPSHOT/spring-framework-reference/htmlsingle/#aop-proxyinghttp:// docs中找到有关此主题的更多信息。 spring.io/spring/docs/4.3.0.BUILD-SNAPSHOT/spring-framework-reference/html单/#transaction

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM