无法使用DAOImplementation类中的HibernateTemplate保存方法保存Student模型对象

时间:2016-07-06 07:18:52

标签: spring hibernate

  

这是我在执行spring application时遇到的异常。任何人都可以帮我解决这个问题。

log4j:WARN No appenders could be found for logger (org.springframework.core.env.StandardEnvironment).
                    log4j:WARN Please initialize the log4j system properly.
                    Hibernate: drop table if exists postgres.student007 cascade
                    Hibernate: create table postgres.student007 (id int4 not null,address varchar(255), email varchar(255), name varchar(255), primary key (id) Exception in thread "main" org.springframework.dao.InvalidDataAccessApiUsageException: Write operations are not allowed in read-only mode (FlushMode.MANUAL): Turn your Session into FlushMode.COMMIT/AUTO or remove 'readOnly' marker from transaction definition.
                    at org.springframework.orm.hibernate4.HibernateTemplate.checkWriteOperationAllowed(HibernateTemplate.java:1135)
                    at org.springframework.orm.hibernate4.HibernateTemplate$12.doInHibernate(HibernateTemplate.java:620)
                    at org.springframework.orm.hibernate4.HibernateTemplate$12.doInHibernate(HibernateTemplate.java:617)
                    at org.springframework.orm.hibernate4.HibernateTemplate.doExecute(HibernateTemplate.java:340)
                    at org.springframework.orm.hibernate4.HibernateTemplate.executeWithNativeSession(HibernateTemplate.java:308)
                    at org.springframework.orm.hibernate4.HibernateTemplate.save(HibernateTemplate.java:617)
                    at dao.StudentDaoImplHT.save(StudentDaoImplHT.java:22)
                    at test.Client.main(Client.java:21)
  

下面是我的配置config.xml文件。任何人都可以帮我解决这个问题。

      <beans>
        <bean id="bds" class="org.apache.commons.dbcp.BasicDataSource">
           <property name="driverClassName" value="org.postgresql.Driver"/>
           <property name="url" value="jdbc:postgresql://localhost:5432/postgres"/>
           <property name="username" value="postgres"/>
           <property name="password" value="postgres"/>
           <property name="maxActive" value="15"/>
           <property name="maxIdle" value="5"/>
           <property name="maxWait" value="5000"/>
        </bean>

        <!--  <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
         -->
           <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
           <property name="dataSource" ref="bds"/>
           <property name="hibernateProperties">
             <props>
               <prop key="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</prop>
               <prop key="hibernate.hbm2ddl.auto">create</prop>
               <prop key="hibernate.show_sql">true</prop>    
             </props>
           </property>
           <property name="annotatedClasses">
             <list>
               <value>model.Student</value>
             </list>
           </property>
         </bean>
         <bean id="ht" class="org.springframework.orm.hibernate4.HibernateTemplate">
         <property name="sessionFactory" ref="sessionFactory"/> 
         </bean>
        <bean id="dao" class="dao.StudentDaoImplHT">
        <property name="ht" ref="ht"/>
        </bean>
        </beans>

1 个答案:

答案 0 :(得分:1)

这是春季交易的问题。您需要配置交易

<tx:annotation-driven />

然后启用事务的注释配置

@Transactional(propagation = Propagation.REQUIRED, readOnly = false)

最后,在方法中添加事务configure。

INSERT INTO pages (title,content) VALUES ("test title","test content")

您的问题是您没有使用该事务,而是将内容写入数据库。这是不允许的,你应该创建一个事务并使readOnly = false。然后你可以创建表。

您可以使用jdbcTemplate.execute(sql)。创建表。