Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring 实体操作的Hibernate静态方法_Spring_Hibernate - Fatal编程技术网

Spring 实体操作的Hibernate静态方法

Spring 实体操作的Hibernate静态方法,spring,hibernate,Spring,Hibernate,我正在使用Struts2和hibernate以及Spring构建一个web应用程序,以便将依赖项注入到action类中。我试图确定选择、更新和插入数据库的静态方法是否是一个好的选择。如果要使用实用程序类,它将包含静态方法,这些方法将充当hibernate会话的包装器,如下所示 第一种选择——静态方法 实用程序类的静态方法应该是线程安全的,因为传递给这些方法的每个对象都是线程的本地对象,并且hibernate会话也是线程安全的。然而,如果我使用一个会话变量,那将是一个问题,但这并不是静态方法的局部

我正在使用Struts2和hibernate以及Spring构建一个web应用程序,以便将依赖项注入到action类中。我试图确定选择、更新和插入数据库的静态方法是否是一个好的选择。如果要使用实用程序类,它将包含静态方法,这些方法将充当hibernate会话的包装器,如下所示

第一种选择——静态方法 实用程序类的静态方法应该是线程安全的,因为传递给这些方法的每个对象都是线程的本地对象,并且hibernate会话也是线程安全的。然而,如果我使用一个会话变量,那将是一个问题,但这并不是静态方法的局部问题。但是,使用静态方法的缺点是它们不能被未来的实现覆盖,因此在功能上是具体的。此外,这可能会鼓励懒惰的设计实践,因为在这些实践中,调用静态方法非常容易,从而导致跨层的各种依赖关系

第二个选项-实例方法 JPAManager类的方法将不再是静态的,类的实例将通过spring注入到动作类中。未来的实现可以通过扩展类来覆盖功能,或者我可以将其作为抽象类编写,并将实现类提供给Spring进行注入。对于可扩展性和长期维护,我更喜欢这种方法。hibernate实体可以传递到业务委托类中,执行操作,在返回操作结果之前,JPAManager实例更新对象,等等

public String execute(){
    //perform business logic on entityObject
    this.jpaManager.updateEntity(entityObject);
    return "success";
}

public JPAManager getJpaManager() {
    return this.jpaManager;
}

public void setJpaManager(JPAManager manager) {
    this.jpaManager = manager;
}

我想知道哪种选择是最好的,因为这是我第一次将所有三个框架实现为一个解决方案。

您也应该考虑回滚

catch(hibernateeexception e)
-在此处仅使用
hibernateeexception
是不正确的

hibernate会话是线程安全的

这不是一个正确的说法

一些值得学习的方法


如果你想要一个例子,如何实现像你这样的自行车,你可以参考。

Spring是关于依赖注入的。依赖项注入非常好,因为它允许在测试中注入模拟依赖项,从而使代码易于测试。静态方法会毁掉这一切。依赖注入还允许AOP:Spring可以注入一个事务代理来包装您的bean,而不是bean本身,从而允许以纯声明的方式处理事务:您只需使用
@transactional
注释您的bean/方法,Spring就会为您打开并提交事务。不要像现在这样管理您的交易。谢谢您的回复。在我对
@Transactional
的快速回顾和您的解释中,我的理解是用
@Transactional
注释的方法将为我管理hibernate事务的自动打开和提交,因此我的方法只需抓取一个会话,执行选择、更新、,或者insert,代理方法将由Spring处理。使用这种方法,您会为方法上带有
@Transactional
注释的实体推荐一个DAO层;或者我的JPAManager类中带有
@Transactional
注释的方法是否足以减少锅炉板代码?您既不了解事务,也不了解spring DI。许多好的问题都会根据专家经验产生一定程度的意见,但对这个问题的回答往往几乎完全基于意见,而不是事实、参考资料或特定的专业知识。事务应该在服务层而不是DAO层进行管理。大多数情况下,一个服务使用多个DAO,并且需要在一个事务中完成所有这些。IMHO这个问题应该作为POB关闭。关于没有过时内容的链接。@RomanC看起来像,clayton rogers想发明一种自己的新方法:)所以为什么不熟悉以前的DAO,甚至是过时的。是的,在等他。我现在还不打算接受答案。我想看看是否有其他人参与。@Clayton Rogers不关心其他人你不是这艘船上的船长。你来这里是关于通用方法的吗?看来你错过了很多。
public class HibernateInterceptor extends MethodFilterInterceptor {

@Override
protected String doIntercept(ActionInvocation invocation) throws    Exception {
        JPAManager.getSessionFactory().openSession();
        String result = invocation.invoke();
        JPAManager.getSessionFactory().getCurrentSession().close();
        return result;
    }
}
public String execute(){
    //perform business logic on entityObject
    this.jpaManager.updateEntity(entityObject);
    return "success";
}

public JPAManager getJpaManager() {
    return this.jpaManager;
}

public void setJpaManager(JPAManager manager) {
    this.jpaManager = manager;
}