Невозможно создать таблицу автоматически и вставлять записи, используя интеграцию Spring и Hibernate - PullRequest
0 голосов
/ 06 февраля 2019

Я новичок в весне и пытаюсь интегрировать спящий с весной.Я использую базу данных MySql и пытаюсь вставить запись с помощью метода saveOrUpdate ().

Таким образом, программа запускает SQL-запрос для создания таблицы (как и должно быть).

Но проблема в том,, хотя он запускает запрос для «создания таблицы», таблица не создается в базе данных.Кроме того, если таблица создается вручную в базе данных, а затем пытается вставить запись, она ничего не делает.

Я пытался использовать методы save () и persist () вместо saveOrUpdate (), но это заняломне никуда.

Это основной класс.Значения класса бина (Employee) были установлены для вставки записи.

public static void main( String[] args )
{
    ApplicationContext context=new 
    ClassPathXmlApplicationContext("sphb.xml");
    EmployeeDAO edao=(EmployeeDAO) context.getBean("d");
    Employee e=new Employee();
    e.setId(1);
    e.setName("sourav");
    e.setSalary(100000);
    edao.saveEmployee(e);
}

Это класс бина: - открытый класс Employee {private int id;личное строковое имя;частная международная зарплата;// геттеры и сеттеры}

Это xml-файл, содержащий всю конфигурацию.

<beans xmlns="http://www.springframework.org/schema/beans"  
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
xmlns:p="http://www.springframework.org/schema/p"  
xsi:schemaLocation="http://www.springframework.org/schema/beans   
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">

    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">  
    <property name="driverClassName"  value="com.mysql.cj.jdbc.Driver"> 
    </property>  
    <property name="url" value="jdbc:mysql://localhost:3306/db"></property>  
    <property name="username" value="root"></property>  
    <property name="password" value="1234"></property>  
    </bean>

    <bean id="mysessionFactory" 
    class="org.springframework.orm.hibernate5.LocalSessionFactoryBean"> 
    <property name="dataSource" ref="dataSource"></property>  

    <property name="mappingResources">  
    <list>  
    <value>mapping.hbm.xml</value>  
    </list>  
    </property>  

    <property name="hibernateProperties">  
        <props>  
            <prop 
            key 
            ="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>  
            <prop key="hibernate.hbm2ddl.auto">update</prop>  
            <prop key="hibernate.show_sql">true</prop>  

        </props>  
    </property>  
    </bean>  

    <bean id="template" 
    class="org.springframework.orm.hibernate5.HibernateTemplate">  
    <property name="sessionFactory" ref="mysessionFactory"></property>  
    <property name="checkWriteOperations" value="false"></property>
    </bean>  

    <bean id="d" class="demo.sphbIntegrate.EmployeeDAO">  
    <property name="template" ref="template"></property>  
    </bean>

    </beans>

Это класс DAO: -

public class EmployeeDAO 
{
    HibernateTemplate template;

    public void setTemplate(HibernateTemplate template) {
        this.template = template;
    }

    public void saveEmployee(Employee e) 
    {
    template.saveOrUpdate(e);
    }
}

Выводится, когда таблицане создается вручную в базе данных: -

log4j:WARN No appenders could be found for logger 
(org.springframework.context.support.ClassPathXmlApplicationContext).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for 
more info.
**Hibernate: create table employee (id integer not null, name varchar(255), 
salary integer, primary key (id)) type=MyISAM
Hibernate: select employee_.id, employee_.name as name2_0_, 
employee_.salary as salary3_0_ from employee employee_ where employee_.id=?
Exception in thread "main" 
org.springframework.dao.InvalidDataAccessResourceUsageException: could not 
extract ResultSet; SQL [n/a]; nested exception is 
org.hibernate.exception.SQLGrammarException: could not extract ResultSet**
at org. springframework. orm. hibernate5. SessionFactoryUtils. 
convertHibernateAccessException (SessionFactoryUtils.java:230)
at org. springframework. orm. hibernate5. HibernateTemplate. doExecute 
(HibernateTemplate.java:387)
and 15 more...

Вывод, когда таблица создается вручную: -

log4j:WARN No appenders could be found for logger 
(org.springframework.context.support.ClassPathXmlApplicationContext).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for 
more info.
**Hibernate: select employee_.id, employee_.name as name2_0_, 
employee_.salary as salary3_0_ from employee employee_ where employee_.id=?**

Просто выполняется этот запрос выбора, а не вставлять один.

1 Ответ

0 голосов
/ 09 февраля 2019

Сделано это, добавив аннотацию для управления транзакциями

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

Также добавлен установщик для sessionFactory, используется аннотация для транзакции и предоставлены права на операцию записи.

public class EmployeeDAO 
{
    HibernateTemplate template;

    public void setTemplate(HibernateTemplate template) {
        this.template = template;
    }
    public void setSessionFactory(SessionFactory sessionFactory)
    {
	this.template=new HibernateTemplate(sessionFactory);
    }

    @Transactional(readOnly=false)
    public void saveEmployee(Employee e) 
    {
	template.saveOrUpdate(e);
    }
}
...