无法使用与XML结合使用Spring的hibernate将记录插入数据库

时间:2019-04-23 12:04:29

标签: spring hibernate spring-mvc

我正在尝试使用Spring MVC和使用XML的hibernate集成来实现注册页面。

Application Context.xml

<?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: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"
 xmlns:tx="http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd"> 

   <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">  
        <property name="driverClassName"  value="oracle.jdbc.driver.OracleDriver"></property>  
        <property name="url" value="jdbc:oracle:thin:@localhost:1521:xe"></property>  
        <property name="username" value="hr"></property>  
        <property name="password" value="umashetti123"></property>  
    </bean>  

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

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

        <property name="hibernateProperties">  
            <props>  
                <prop key="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</prop>  
                <prop key="hibernate.hbm2ddl.auto">update</prop> 
                <prop key="hibernate.show_sql">true</prop>  
                <prop key="checkWriteOperation" >false</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>

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


    <bean id="d" class="com.uday.Login_DetailsDao">  
    <property name="template" ref="template"></property>  
    </bean>  

    </beans>  

控制器类

package com.uday;

import java.util.List;

import javax.servlet.http.HttpServletRequest;

import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import org.springframework.stereotype.Controller;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;





@Controller
public class ControllerSignUp_Login {


    public ControllerSignUp_Login() {
        // TODO Auto-generated constructor stub
    }

    @RequestMapping("/hello")   
    public String diaplay(@RequestParam("name") String name, @RequestParam("pass") String pass,Model m) {
        Login_DetailsDao dao = (Login_DetailsDao) getBean(); 

        if(dao.isLogoinSuccessfull(name , pass)) {
            m.addAttribute("message", "Hello"+name);
            return "Success";
        }
        else {
            m.addAttribute("message", "You have Entered Wrong pin");
            return "Failure";
        }
    }

    @RequestMapping("/SignUp")
    public String redirect() {
        System.out.println("ControllerSignUp_Login.display()");
        return "signup";
    }

    @RequestMapping("/login")
    public String display() {
        System.out.println("ControllerSignUp_Login.display()");
        return "login";
    }

    @RequestMapping("/updateDetails")
    @Transactional
    public String display(HttpServletRequest req , Model M) {
        String firstName=req.getParameter("firstName");  
        String lastName=req.getParameter("lastName"); 
        String mobileNo=req.getParameter("mobileNo");  
        String address=req.getParameter("address");  
        String city=req.getParameter("city");  
        String password=req.getParameter("password");             
        Login_DetailsDao dao = (Login_DetailsDao) getBean();        
        if(checkLength(firstName)  && checkLength(lastName) && checkLength(mobileNo) && checkLength(address) && checkLength(city) &&  checkLength(password)) {
            Login_Details ld = new Login_Details();
            ld.setFirstName(firstName);
            ld.setLastName(lastName);
            ld.setCity(city);
            ld.setAddress(address);
            ld.setMobileNo(mobileNo);
            ld.setPassword(password);

            dao.saveEmployee(ld);
            M.addAttribute("message", "SignUp Successfull !! Thank You");
            M.addAttribute("displayLogin", true);
            return "Success";
        }
        else {
            M.addAttribute("message","SignUp Failed !! All details are mandatory.");
            return "signup";

        }
    }

    public boolean checkLength(String s) {
        if(s != null && s.length() > 0) {
            return true;
        }
        return false;

    }

    public Object getBean() {
        ApplicationContext  appcontext = new ClassPathXmlApplicationContext("Applicationcontext.xml");            
        Login_DetailsDao lDDao =(Login_DetailsDao)appcontext.getBean("d");  
        return lDDao;
    }


}

DAO类

package com.uday;

import java.util.ArrayList;
import java.util.List;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.springframework.orm.hibernate5.HibernateTemplate;
import org.springframework.orm.hibernate5.HibernateTransactionManager;
import org.springframework.transaction.annotation.Transactional;


public class Login_DetailsDao {


    HibernateTemplate template; 

    HibernateTransactionManager hbt;



    public HibernateTransactionManager getHbt() {
        return hbt;
    }

    public void setHbt(HibernateTransactionManager hbt) {
        this.hbt = hbt;
    }

    public Login_DetailsDao() {
        // TODO Auto-generated constructor stub
    }

    @Transactional
    public void saveEmployee(Login_Details e){  
        System.out.println("Login_DetailsDao.saveEmployee()"+e.getMobileNo());
        SessionFactory sf = hbt.getSessionFactory();
        Session session   =sf.getCurrentSession();
        Transaction t     =session.beginTransaction();   
        session.persist(e);         
        t.commit();  
        session.close();    
    }

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

    public List<Login_Details> getEmployees(){  
        List<Login_Details> list=new ArrayList<Login_Details>();  
        list=template.loadAll(Login_Details.class);  
        return list;  
    } 

}

我能够获取login_details数据,但无法插入记录。

获得例外

org.xml.sax.SAXParseException; lineNumber:51; columnNumber:29; cvc-complex-type.2.4.c:匹配的通配符很严格,但是找不到元素'tx:annotation-driven'的声明。

请问有人可以解决这个问题吗?

3 个答案:

答案 0 :(得分:0)

您的代码在多个级别上都有缺陷。

  1. 请勿仅由于需要bean实例而创建BeanFactoryApplicationContext。而是对那个bean使用依赖注入。
  2. 您在BeanFactory上使用ApplicationContext的事实是代码无法正常工作的原因之一。有关为什么不应该使用BeanFactory的信息,请参见this
  3. 您不使用事务,没有事务就不会在数据库中保留任何内容。

现在,首先需要在控制器中依赖注入Login_DetailsDao而不是创建BeanFactory并获取实例。

@Controller
public class ControllerSignUp_Login {

    private final Login_DetailsDao dao;

    @Autowired // If using Spring 4.3 or later this isn't needed
    public ControllerSignUp_Login(Login_DetailsDao dao) {
        this.dao=dao;
    }    
}

现在方法中将使用此实例,而不是执行查找。

您的Login_DetailsDao应该在SessionFactory上运行,别无其他。

public class Login_DetailsDao {


    private final SessionFactory sf; 

    public Login_DetailsDao(SessionFactory sf) {\
        this.sf=sf;
    }

    @Transactional
    public void saveEmployee(Login_Details e){  
        sf.getCurrentSession().save(e);
    }

    @Transactional(readOnly=true)
    public List<Login_Details> getEmployees(){  
        return sf.getCurrentSession()
                 .createQuery("SELECT ld FROM Login_Details", Login_Details.class)
                 .getResult();
    } 
}

这就是您所需要的。现在终于在您的XML中将所有这些结合在一起。

<?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:p="http://www.springframework.org/schema/p"  
    xsi:schemaLocation="http://www.springframework.org/schema/beans  
        http://www.springframework.org/schema/beans/spring-beans.xsd"
 xmlns:tx="http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"> 

    <tx:annotation-driven />

   <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">  
        <property name="driverClassName"  value="oracle.jdbc.driver.OracleDriver"></property>  
        <property name="url" value="jdbc:oracle:thin:@localhost:1521:xe"></property>  
        <property name="username" value="hr"></property>  
        <property name="password" value="umashetti123"></property>  
    </bean>  

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

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

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

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

    <bean id="transactionManager"
        class="org.springframework.orm.hibernate5.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory" />
    </bean>


    <bean id="d" class="com.uday.Login_DetailsDao">
        <constructor-arg ref="sessionFactory" />  
    </bean>  

</beans>  

答案 1 :(得分:0)

一个简单的更改就使该应用程序正常工作。

1>删除了applicationcontext.xml并将内容添加到disapatcher-servlet.xml

disaptcher-servlet.xml

<?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:context="http://www.springframework.org/schema/context"  
    xmlns:mvc="http://www.springframework.org/schema/mvc"  
    xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="  
        http://www.springframework.org/schema/beans  
        http://www.springframework.org/schema/beans/spring-beans.xsd  
        http://www.springframework.org/schema/context  
        http://www.springframework.org/schema/context/spring-context.xsd  
        http://www.springframework.org/schema/mvc  
        http://www.springframework.org/schema/mvc/spring-mvc.xsd
        http://www.springframework.org/schema/tx 
        http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">  

        <context:annotation-config/>

 <tx:annotation-driven />

    <!-- Provide support for component scanning -->  
    <context:component-scan base-package="com.uday" />  

    <!--Provide support for conversion, formatting and validation -->  
    <mvc:annotation-driven/>  
<!-- Define Spring MVC view resolver -->  
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">  
        <property name="prefix" value="/WEB-INF/page/"></property>  
        <property name="suffix" value=".jsp"></property>          
     </bean> 

       <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">  
        <property name="driverClassName"  value="oracle.jdbc.driver.OracleDriver"></property>  
        <property name="url" value="jdbc:oracle:thin:@localhost:1521:xe"></property>  
        <property name="username" value="hr"></property>  
        <property name="password" value="umashetti123"></property>  
    </bean>  

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

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

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

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

    <bean id="transactionManager"
        class="org.springframework.orm.hibernate5.HibernateTransactionManager">
        <property name="sessionFactory" ref="mysessionFactory" />
    </bean>

    <bean id="d" class="com.uday.Login_DetailsDao">  
    <constructor-arg ref="mysessionFactory" /> 
    </bean>   


</beans>  

DAO类:

package com.uday;

import java.util.Iterator;
import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.SessionFactory;
import org.springframework.transaction.annotation.Transactional;


public class Login_DetailsDao {


    private final SessionFactory sessionFactory;


    public Login_DetailsDao(SessionFactory sessionFactory) {
        this.sessionFactory = sessionFactory;
    }

    @Transactional
    public void saveEmployee(Login_Details e){      
        sessionFactory.getCurrentSession().save(e);   
    }

    public boolean isLogoinSuccessfull(String uName , String password) {
        List<Login_Details> a= getEmployees();
        Iterator<Login_Details> i = a.iterator();
        while(i.hasNext()) {
            Login_Details ld = i.next();
            String mobileNo = ld.getMobileNo();
            String pas      = ld.getPassword();
            if(mobileNo != null && mobileNo.equals(uName)  && pas != null && pas.equals(password)) {
                return true;
            }
        }


        return false;

    }

    @Transactional
    public List<Login_Details> getEmployees(){  
        Criteria criteria =  sessionFactory.getCurrentSession().createCriteria(Login_Details.class);
        List<Login_Details> l = criteria.list();
        return l;
    } 

}

控制器类:

package com.uday;

import javax.servlet.http.HttpServletRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;


@Controller
public class ControllerSignUp_Login {

    @Autowired
    private final Login_DetailsDao dao;

    @Autowired
    public ControllerSignUp_Login(Login_DetailsDao login_DetailsDao) {
        this.dao = login_DetailsDao;
    }

    @RequestMapping("/hello")
    @Transactional
    public String diaplay(@RequestParam("name") String name, @RequestParam("pass") String pass,Model m) {
        if(dao.isLogoinSuccessfull(name , pass)) {
            m.addAttribute("message", "Hello"+name);
            return "Success";
        }
        else {
            m.addAttribute("message", "You have Entered Wrong pin");
            return "Failure";
        }
    }

    @RequestMapping("/SignUp")
    public String redirect() {
        System.out.println("ControllerSignUp_Login.display()");
        return "signup";
    }

    @RequestMapping("/login")
    public String display() {
        System.out.println("ControllerSignUp_Login.display()");
        return "login";
    }

    @RequestMapping("/updateDetails")
    @Transactional
    public String display(HttpServletRequest req , Model M) {
        String firstName=req.getParameter("firstName");  
        String lastName=req.getParameter("lastName"); 
        String mobileNo=req.getParameter("mobileNo");  
        String address=req.getParameter("address");  
        String city=req.getParameter("city");  
        String password=req.getParameter("password");       
        if(checkLength(firstName)  && checkLength(lastName) && checkLength(mobileNo) && checkLength(address) && checkLength(city) &&  checkLength(password)) {
            Login_Details ld = new Login_Details();
            ld.setFirstName(firstName);
            ld.setLastName(lastName);
            ld.setCity(city);
            ld.setAddress(address);
            ld.setMobileNo(mobileNo);
            ld.setPassword(password);
            dao.saveEmployee(ld);
            M.addAttribute("message", "SignUp Successfull !! Thank You");
            M.addAttribute("displayLogin", true);
            return "Success";
        }
        else {
            M.addAttribute("message","SignUp Failed !! All details are mandatory.");
            return "signup";

        }
    }

    public boolean checkLength(String s) {
        if(s != null && s.length() > 0) {
            return true;
        }
        return false;

    }

}

项目结构如下

enter image description here

答案 2 :(得分:-1)

与其获取当前会话并进行交易,不如打开新会话,而是像魅力一样工作!!!

我不知道为什么要进行当前会话,为什么它不起作用!

@Transactional
    public void saveEmployee(Login_Details e){  
        System.out.println("Login_DetailsDao.saveEmployee()"+e.getMobileNo());
        SessionFactory sf = hbt.getSessionFactory();
        //Changed here
        Session session   =sf.openSession(); //Session session   =sf.getCurrentSession();
        Transaction t     =session.beginTransaction();   
        session.persist(e);         
        t.commit();  
        session.close();    
    }