Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/315.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
Java 在Spring3之前注入Hibernate会话的最佳方法_Java_Hibernate_Spring - Fatal编程技术网

Java 在Spring3之前注入Hibernate会话的最佳方法

Java 在Spring3之前注入Hibernate会话的最佳方法,java,hibernate,spring,Java,Hibernate,Spring,我不确定使用Spring3将Hibernate的会话实例注入DAO类的最佳方法是什么。我没有为此使用Spring的Hibernate模板支持,因此下面是我在DAO类中的代码 public void setSessionFactory(SessionFactory sessionFactory){ this.sessionFactory=sessionFactory; } public SessionFactory getSessionFactory(){ log.info("

我不确定使用Spring3将Hibernate的会话实例注入DAO类的最佳方法是什么。我没有为此使用Spring的Hibernate模板支持,因此下面是我在DAO类中的代码

public void setSessionFactory(SessionFactory sessionFactory){
    this.sessionFactory=sessionFactory;
}


public SessionFactory getSessionFactory(){
    log.info("Returning a refrence to the session instance");
    if(sessionFactory==null){
         log.error("Not able to find any associated session");
         throw new RuntimeException("Not able to find any associated session");
    }
    return sessionFactory;
}
下面是将会话注入此方法的代码

<bean id="genericSessionFactory" class="HibernateSessionFactory"
        factory-method="getSessionfactory" scope="prototype/>


这样,您的类对Spring就没有任何依赖关系,您只需使用普通的Hibernate即可。

您把它复杂化了

请不要使用Hibernate文档中不断出现的糟糕的
HibernateUtil
模式。Spring提供了一种非常非常好的方式来配置Hibernate
SessionFactory
——LocalSessionFactoryBean
()

LocalSessionFactoryBean
生成一个
SessionFactory
对象,您可以将其作为属性注入到DAOBean中


Spring很高兴您不使用
HibernateDaoSupport
HibernateTemplate
——这里有一个解释,说明如何很好地做到这一点。

结合了skaffman的帖子和Sean的帖子,再加上注释的使用

xml


product.hbm.xml
hibernate.dialogue=org.hibernate.dialogue.hsql方言

使用Hibernate的可取方法是通过JPA(Hibernate entitymanager):

applicationContext.xml
中:

<bean id="entityManagerFactory"
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="persistenceUnitName" value="yourUnitName" />
    <property name="dataSource" ref="dataSource" /> <!-- needs a data source bean -->
    <property name="jpaVendorAdapter">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
            <property name="databasePlatform" value="${hibernate.dialect}" />
        </bean>
    </property>
</bean>



<bean id="transactionManager" 
  class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>


您需要一个
META-INF/persistence.xml

如何配置
SessionFactory
本身?通过使用Hibernate标准方式,HibernateUtil类从类路径读取各种属性和cfg文件这就是我正在做的我有一个通用DAO类,其中有所有通用的持久性方法,我是在DAO类中注入Hibernate会话工厂,而不是使用Spring Hibernate SessionFactory Util类,我使用的是我自己的实现。因此,我似乎走上了正确的道路。我不喜欢注入SessionFactory,因为它是模拟会话并在单元测试中对其进行断言的PITA。注入会话而不是SessionFactory难道不可能吗?@BastianVoigt这是另一个问题。请随便问。但简单的回答是:只有当存储库类的作用域不是singleton,或者会话是作为作用域代理的bean时,这才可能实现。这两种说法听起来都很恶心me@BastianVoigt虽然我支持这一点,但我认为JPA在这方面并没有真正帮助你。你应该有完全一样的problem@SeanPatrickFloyd不完全正确。使用JPA,您可以注入EntityManager,它类似于会话。无需在代码中直接使用EntityManagerFactory。感谢文档指针,我必须说,将使用Spring的LocalSessionFactoryBean处理会话工厂创建,然后使用我的通用DAO模式使用LocalSessionFactoryBean创建的SessionFactory。请发布一个等效的java配置
@Respository("productDao")
public class ProductDaoImpl implements ProductDao {

    @Autowired
        private SessionFactory sessionFactory;

            public Collection loadProductsByCategory(String category) {
                    return this.sessionFactory.getCurrentSession()
                        .createQuery(
                            "from test.Product product where product.category=?")
                        .setParameter(0, category)
                        .list();
        }
}
<beans>

  <bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    <property name="driverClassName" value="org.hsqldb.jdbcDriver"/>
    <property name="url" value="jdbc:hsqldb:hsql://localhost:9001"/>
    <property name="username" value="sa"/>
    <property name="password" value=""/>
  </bean>

  <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    <property name="dataSource" ref="myDataSource"/>
    <property name="mappingResources">
      <list>
        <value>product.hbm.xml</value>
      </list>
    </property>
    <property name="hibernateProperties">
      <value>
        hibernate.dialect=org.hibernate.dialect.HSQLDialect
      </value>
    </property>
  </bean>

</beans>
@PersistenceContext
private EntityManager entityManager;
<bean id="entityManagerFactory"
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="persistenceUnitName" value="yourUnitName" />
    <property name="dataSource" ref="dataSource" /> <!-- needs a data source bean -->
    <property name="jpaVendorAdapter">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
            <property name="databasePlatform" value="${hibernate.dialect}" />
        </bean>
    </property>
</bean>



<bean id="transactionManager" 
  class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>