如何使用静态块来初始化spring hibernate查询功能

时间:2013-09-18 10:09:59

标签: java hibernate spring-mvc static

我是Spring Hibernate的新手,所以我遇到的问题是由一个在静态块中初始化的函数引起的。

这是我的DAO课程:

private static HibernateTemplate hibernateTemplate;
public void setSessionFactory(SessionFactory sessionFactory) {
    hibernateTemplate = new HibernateTemplate(sessionFactory);
}

static{
    loadAllProvince();
}
public static void loadAllProvince ()  {
    List regionList = hibernateTemplate.find("FROM regions");

    if (regionList.size() > 0 ) {           
       for (int i=0; i<regionList.size(); i++) {                
          Object[] obj = (Object[]) regionList.get(i) ;
          mapRegion.put(obj[1].toString(), obj[0].toString());                  
       }                        
    }   
 }

这是我的applicationContext.xml中的bean配置:

<bean id="regionDAOBean" class="com.dao.RegionDAO">
   <property name="sessionFactory" ref="sessionFactoryBean"/> 
</bean>

当我运行我的应用程序时,例外说:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'regionDAOBean' defined in class path resource [applicationContext.xml]: 
Instantiation of bean failed; nested exception is java.lang.ExceptionInInitializerError

在我初始化静态块中的函数之前,它一直工作,所以我应该怎么做才能在静态块中初始化函数?

3 个答案:

答案 0 :(得分:2)

我只是使用@PostConstruct(并摆脱init方法):

@PostConstruct
public void loadAllProvince () {
   ...
}
  

JSR-250 @PostConstruct和@PreDestroy注释通常是   被认为是接受现代生命周期回调的最佳实践   Spring应用程序。使用这些注释意味着你的bean是   没有耦合到Spring特定的接口。有关详情,请参阅章节   5.9.6,“@ PostConstruct和@PreDestroy”。

     

如果您不想使用JSR-250注释但仍然存在   希望删除耦合考虑使用init-method和   destroy-method对象定义元数据。

http://docs.spring.io/spring/docs/3.2.x/spring-framework-reference/html/beans.html

问题是在Spring有机会完成bean初始化之前调用静态块(正如@sodik指出的那样)。这是@PostConstruct派上用场的时候,因为它告诉Spring在bean完全初始化后调用这个方法。

答案 1 :(得分:0)

导致问题(如jax所示)静态方法loadAllProvince()在注入sessionFactory之前执行。但是我宁愿使loadAllProvince()非静态并在填充bean属性后调用它,例如

<bean id="regionDAOBean" class="com.dao.RegionDAO" init-method="loadAllProvince">
   <property name="sessionFactory" ref="sessionFactoryBean"/> 
</bean>

有关详细信息,请参阅http://www.mkyong.com/spring/spring-init-method-and-destroy-method-example/

答案 2 :(得分:0)

我认为你真正想要的是使用init-method:

<bean id="regionDAOBean" class="com.dao.RegionDAO" init-method="init">
   <property name="sessionFactory" ref="sessionFactoryBean"/> 
</bean>




private HibernateTemplate hibernateTemplate;
public void setSessionFactory(SessionFactory sessionFactory) {
    hibernateTemplate = new HibernateTemplate(sessionFactory);
}

public void init() throws Exception {
    loadAllProvince();
}

public void loadAllProvince ()  {
    List regionList = hibernateTemplate.find("FROM regions");

    if (regionList.size() > 0 ) {           
       for (int i=0; i<regionList.size(); i++) {                
          Object[] obj = (Object[]) regionList.get(i) ;
          mapRegion.put(obj[1].toString(), obj[0].toString());                  
       }                        
    }   
 }