Java 爪哇及;Hibernate-使用接口时的会话管理

Java 爪哇及;Hibernate-使用接口时的会话管理,java,spring,hibernate,inheritance,Java,Spring,Hibernate,Inheritance,我有一个问题与以下代码,请我需要帮助。 在服务层,在使用Hibernate时,我使用注释来管理会话,这非常有效 @Override @Transactional public Response delete(Integer id) throws Exception { Response response = new Response(); try { response.setData(videoDao.delete(id)); } catch (Excep

我有一个问题与以下代码,请我需要帮助。 在服务层,在使用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正在注入IStance,其中包括sessionFactory,但是如果我手动进行注入(因为我不能使用注入的对象,因为它是接口,而不是具有此方法的真实类),sessionFactory始终为空

public interface IDao {
    public boolean delete(int id) throws Exception;
}
这就是我在服务层中使用接口定义dao的方式:

@Autowired
IDao videoDao;

为了总结我对您所寻找的内容的理解,您希望让Spring代理在类中定义的方法,而不是在该类实现的接口中定义的方法

根据上述假设,您观察到的行为符合Spring AOP代理生成

Spring AOP代理生成默认情况下使用:

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

  • 如果目标类未实现任何接口,则CGLIB代理

  • 因此,对于JDK代理,SpringAOP使用目标接口查找需要代理的方法。SpringJDK代理只实现接口中定义的方法。因此,如果有任何方法是直接在目标类中定义的,而不是在接口中定义的,那么这些方法将不会被代理,这就是您正在观察的行为

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

    这是默认行为

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

    正如您已经指出的,要使其工作,我们需要在代码中使用/注入类,而不是接口,尽管这不是最佳实践

    有关此主题的更多信息,请访问 及

    您能给出一个导致空sessionFactory的代码示例吗?@Faabass由于您是自动连接
    IDao videoDao
    ,您如何调用
    接口中未指定的另一个方法
    ?什么是“注释不起作用”?请发布videoDAO类的代码,并使用非继承的方法,该方法应该是非继承的working@MadhusudanaReddy Sunnapu是的,我知道这听起来很愚蠢,但我认为它的工作方式是替换类的接口,但我想这种更改将违背最佳实践。我有一些想法,比如IDao videoDao=new videoDao();但是videoDao拥有的方法是IDao的方法,而不是IDao的方法VideoDao@Faabass你是对的,这将违背最佳实践。不管怎样,请在下面找到我的答案,看看这是否对你的问题有帮助。