2012-10-05 33 views
0

我尝试了不同的配置,但无效。错误保持不变。这里从BoneCPs网站采取所需的配置:Spring 3.1 + hibernate 4:无法运行

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:aop="http://www.springframework.org/schema/aop" 
     xmlns:context="http://www.springframework.org/schema/context" 
     xmlns:tx="http://www.springframework.org/schema/tx" 

     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd 
      http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.2.RELEASE.xsd 
      http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.2.RELEASE.xsd 
      http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd 
">  

    <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean" autowire-candidate="" autowire="autodetect"> 
     <property name="hibernateProperties"> 
      <props> 
       <prop key="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</prop> 
       <prop key="hibernate.show_sql">true</prop> 
       <prop key="hibernate.hbm2ddl.auto">create</prop> 
       <prop key="hibernate.connection.provider_class">com.jolbox.bonecp.provider.BoneCPConnectionProvider</prop> 
       <prop key="hibernate.connection.driver_class">org.postgresql.Driver</prop> 
       <prop key="hibernate.connection.url">jdbc:postgresql:MyDB</prop> 
       <prop key="hibernate.connection.username">postgres</prop> 
       <prop key="hibernate.connection.password">123456</prop> 
       <prop key="bonecp.idleMaxAge">240</prop> 
       <prop key="bonecp.idleConnectionTestPeriod">60</prop> 
       <prop key="bonecp.partitionCount">1</prop> 
       <prop key="bonecp.acquireIncrement">5</prop> 
       <prop key="bonecp.maxConnectionsPerPartition">60</prop> 
       <prop key="bonecp.minConnectionsPerPartition">5</prop> 
       <prop key="bonecp.statementsCacheSize">50</prop> 
       <prop key="bonecp.releaseHelperThreads">2</prop> 
      </props> 
     </property> 
    </bean> 
    <!--<bean id="transactionManager" 
      class="org.springframework.orm.hibernate4.HibernateTransactionManager"> 
     <property name="sessionFactory" ref="sessionFactory" /> 
    </bean> 
    <tx:annotation-driven transaction-manager="txManager" /> --> 

    <bean id="AbstractHibernateDAO" abstract="true" 
      class="org.bitbucket.myName.moleculedatabaseframework.dao.AbstractHibernateDAO"/> 

    <bean id="ChemicalStructureDAO" extends="AbstractHibernateDAO" 
      class="org.bitbucket.myName.moleculedatabaseframework.dao.ChemicalStructureDAO"/> 
    <bean id="ChemicalCompoundDAO" extends="AbstractHibernateDAO" 
      class="org.bitbucket.myName.moleculedatabaseframework.dao.ChemicalCompoundDAO"/> 
</beans> 

和代码包含自动连接会话工厂:

@Repository 
public abstract class AbstractHibernateDAO< T extends Serializable> { 

    private final Class< T> clazz; 
    @Autowired 
    SessionFactory sessionFactory; 

    public AbstractHibernateDAO(final Class< T> clazzToSet){ 
     this.clazz = clazzToSet; 
    } 

    public T getById(final Long id) { 
     Preconditions.checkArgument(id != null); 
     return (T) this.getCurrentSession().get(this.clazz, id); 
    } 

    public List< T> getAll() { 
     return this.getCurrentSession() 
       .createQuery("from " + this.clazz.getName()).list(); 
    } 

    public void create(final T entity) { 
     Preconditions.checkNotNull(entity); 
     this.getCurrentSession().persist(entity); 
    } 

    public void update(final T entity) { 
     Preconditions.checkNotNull(entity); 
     this.getCurrentSession().merge(entity); 
    } 

    public void delete(final T entity) { 
     Preconditions.checkNotNull(entity); 
     this.getCurrentSession().delete(entity); 
    } 

    public void deleteById(final Long entityId) { 
     final T entity = this.getById(entityId); 
     Preconditions.checkState(entity != null); 
     this.delete(entity); 
    } 

    protected final Session getCurrentSession() { 
     return this.sessionFactory.getCurrentSession(); 
    } 
} 

当试图创建一个新的实体(片段的最后一行),我得到一个错误:

ApplicationContext context = new ClassPathXmlApplicationContext("ApplicationContext.xml"); 

ChemicalStructureDAO structureDAO = (ChemicalStructureDAO) context.getBean("ChemicalStructureDAO"); 

ChemicalStructure structure1 = new ChemicalStructure(); 
structure1.setStructureKey("c1ccccc1"); 
structure1.setStructureData("c1ccccc1"); 

structureDAO.create(structure1); 

我得到一个NullPointerException:

java.lang.NullPointerException 
    at org.bitbucket.myName.moleculedatabaseframework.dao.AbstractHibernateDAO.getCurrentSession(AbstractHibernateDAO.java:78) 
    at org.bitbucket.myName.moleculedatabaseframework.dao.AbstractHibernateDAO.create(AbstractHibernateDAO.java:54) 
    at org.bitbucket.myName.moleculedatabaseframework.App.main(App.java:32) 
------------------------------------------------------------------------ 

也许我误解了autowired意味着什么?我认为那个属性会自动设置。所以我尝试以下操作:

ApplicationContext context = new ClassPathXmlApplicationContext("ApplicationContext.xml"); 
SessionFactory sessionfactory = (SessionFactory)context.getBean("sessionFactory"); 

ChemicalStructureDAO structureDAO = (ChemicalStructureDAO) context.getBean("ChemicalStructureDAO"); 
structureDAO.setSessionFactory(sessionfactory); 

ChemicalStructure structure1 = new ChemicalStructure(); 
structure1.setStructureKey("c1ccccc1"); 
structure1.setStructureData("c1ccccc1"); 

structureDAO.create(structure1); 

这将导致以下错误:

Exception in thread "main" org.hibernate.HibernateException: No Session found for current thread 
at org.springframework.orm.hibernate4.SpringSessionContext.currentSession(SpringSessionContext.java:97) 
at org.hibernate.internal.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:941) 
at org.bitbucket.myName.moleculedatabaseframework.dao.AbstractHibernateDAO.getCurrentSession(AbstractHibernateDAO.java:78) 
at org.bitbucket.myName.moleculedatabaseframework.dao.AbstractHibernateDAO.create(AbstractHibernateDAO.java:54) 

我看着吨的教程,但他们都忽略了什么似乎是基本的东西,得到的东西运行,例如。 ApplicationContext context = new ClassPathXmlApplicationContext(“ApplicationContext.xml”);没有出现在任何spring + hibernate教程中。有人能给我一个完整的教程,假设我完全愚蠢,并告诉我每一步都需要,并且有一个实际运行时重复代码的应用程序? (是的,现在变得非常沮丧了,说实话,如果我明白了jdbc,我会在几个小时前开始运行)

现在,我该如何运行?自动装配工作如何?

编辑: AS FOUND通过 “接受的答案” 的帮助下,解决方案:

新的Spring配置文件:

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:aop="http://www.springframework.org/schema/aop" 
     xmlns:context="http://www.springframework.org/schema/context" 
     xmlns:tx="http://www.springframework.org/schema/tx" 

     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd 
      http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd 
      http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd 
      http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd 
">  


    <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean" autowire="autodetect"> 
     <property name="dataSource" ref="dataSource" /> 
     <property name="annotatedClasses"> 
      <list> 
       <value>org.bitbucket.myName.moleculedatabaseframework.entityclasses.ChemicalStructure</value> 
       <value>org.bitbucket.myName.moleculedatabaseframework.entityclasses.ChemicalCompound</value> 
       <value>org.bitbucket.myName.moleculedatabaseframework.entityclasses.ChemicalCompoundComposition</value> 
      </list> 
     </property> 

     <property name="hibernateProperties"> 
      <props> 
       <prop key="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</prop> 
       <prop key="hibernate.show_sql">true</prop> 
       <prop key="hibernate.hbm2ddl.auto">create</prop> 
      </props> 
     </property> 
    </bean>  

    <!-- Spring bean configuration. Tell Spring to bounce off BoneCP --> 
    <bean id="dataSource" 
      class="org.springframework.jdbc.datasource.LazyConnectionDataSourceProxy"> 
     <property name="targetDataSource"> 
      <ref local="mainDataSource" /> 
     </property> 
    </bean> 

    <!-- BoneCP configuration --> 
    <bean id="mainDataSource" class="com.jolbox.bonecp.BoneCPDataSource" destroy-method="close"> 
     <property name="driverClass" value="org.postgresql.Driver" /> 
     <property name="jdbcUrl" value="jdbc:postgresql:MolDB" /> 
     <property name="username" value="postgres"/> 
     <property name="password" value="123456"/> 
     <property name="idleConnectionTestPeriod" value="60"/> 
     <property name="idleMaxAge" value="240"/>  
     <property name="maxConnectionsPerPartition" value="60"/> 
     <property name="minConnectionsPerPartition" value="20"/> 
     <property name="partitionCount" value="3"/> 
     <property name="acquireIncrement" value="10"/>        
     <property name="statementsCacheSize" value="50"/> 
     <property name="releaseHelperThreads" value="3"/> 
    </bean> 

    <bean id="txManager" 
      class="org.springframework.orm.hibernate4.HibernateTransactionManager"> 
     <property name="sessionFactory" ref="sessionFactory" /> 
    </bean> 
    <tx:annotation-driven transaction-manager="txManager" /> 

    <context:annotation-config /> 

    <bean id="AbstractHibernateDAO" abstract="true" 
      class="org.bitbucket.myName.moleculedatabaseframework.dao.AbstractHibernateDAO"/> 

    <bean id="ChemicalStructureDAO" parent="AbstractHibernateDAO" 
      class="org.bitbucket.myName.moleculedatabaseframework.dao.ChemicalStructureDAO"/> 
    <bean id="ChemicalCompoundDAO" parent="AbstractHibernateDAO" 
      class="org.bitbucket.myName.moleculedatabaseframework.dao.ChemicalCompoundDAO"/> 
</beans> 

我不得不添加

<context:annotation-config /> 

到文件并在sessionFactory配置中声明已注释的实体类:

<property name="annotatedClasses"> 
    <list> 
     <value>org.bitbucket.myName.moleculedatabaseframework.entityclasses.ChemicalStructure</value> 
     <value>org.bitbucket.myName.moleculedatabaseframework.entityclasses.ChemicalCompound</value> 
     <value>org.bitbucket.myName.moleculedatabaseframework.entityclasses.ChemicalCompoundComposition</value> 
    </list> 
</property> 

我不得不取消对事务管理器部分的注释,并且因为更改了数据源配置,因为我使用的配置不起作用(需要DataSource)。

我也不得不

@Repository 
@Transactional 
public abstract class AbstractHibernateDAO< T extends Serializable> { 
    //code... 
} 

添加到AbstractHibernateDAO。我正在考虑编写一篇博客文章并在此处建立链接。对于任何人来说,新的Spring和hibernate将非常有用。

+0

你可以给你的applicationContext.xml或者一个xml在spring初始化的时候...... – sgpalit

回答

1

在spring xml中你有这样的东西吗?

<context:annotation-config /> 
<context:component-scan base-package="base.package" /> 

这将扫描包含注释的类。

+0

用自动装配解决了这个问题。我仍然得到:异常在线程“main”org.hibernate.HibernateException:没有发现当前线程的会话 –

+1

您取消注释transactionManager Bean和tx:注释驱动? txManager应该与TransactionManager的id相同。 – sgpalit

+0

是的。谢谢。这也有帮助。之后,我遇到了其他几个问题,但现在我得到了它的工作!我正在考虑创建一篇博文。完整的答案太大而不能放在这里。我会将yoru问题标记为答案,并将更新后的配置添加到我的初始帖子中。 –

相关问题