冬眠和春天的一体化问题

时间:2017-04-24 16:03:41

标签: java spring hibernate spring-mvc

我目前正在尝试将hibernate与spring集成。我使用dao设计模式和mysql作为数据库。我正在尝试在数据库中添加contacte实体,但它没有添加,也没有显示错误。通过我可以获取联系人列表的方式并通过id获取它但我无法更新或插入

这是我的上下文文件

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

    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
      ">

    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver" />
        <property name="url" value="jdbc:mysql://localhost:3306/mailmaneger" />
        <property name="username" value="root" />
        <property name="password" value="" />
        <property name="defaultAutoCommit" value="false" />
    </bean>
    <bean id="transactionManager"
        class="org.springframework.orm.hibernate5.HibernateTransactionManager">
        <property name="sessionFactory" ref="mysessionFactory" />

    </bean>
    <bean id="mysessionFactory"
        class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
          <property name="packagesToScan" value="biz.picosoft.entity"/>


        <property name="dataSource" ref="dataSource"></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="biz.picosoft.daoImpl.ContacteDaoImpl">
        <property name="template" ref="template"></property>
    </bean>



</beans>

泛型dao文件

package biz.picosoft.daoImpl;

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.List;

import org.springframework.orm.hibernate5.HibernateTemplate;
import org.springframework.transaction.annotation.Transactional;

import dao.GenericDao;

@Transactional(readOnly = false)
public class GenericDaoImp<T> implements GenericDao<T> {
    HibernateTemplate template;

    protected Class<T> daoType;

    public GenericDaoImp() {
        Type t = getClass().getGenericSuperclass();
        ParameterizedType pt = (ParameterizedType) t;
        daoType = (Class) pt.getActualTypeArguments()[0];
    }

    public HibernateTemplate getTemplate() {
        return template;
    }

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

    public void insert(T t) {
        // TODO Auto-generated method stub
        template.save(t);

    }

    public void update(T t) {
        // TODO Auto-generated method stub
        template.update(t);
    }

    public void delete(T t) {
        // TODO Auto-generated method stub
        template.delete(t);
    }

    public T findById(Class<T> t, String id) {
        // TODO Auto-generated method stub
        return template.get(t, id);
    }

    public List<T> findAll() {
        // TODO Auto-generated method stub
        return template.loadAll(daoType);
    }

}

contacte dao file

package dao;

import biz.picosoft.entity.Contacte;

public interface ContacteDao extends GenericDao<Contacte> {

}

contactaoimpl

package biz.picosoft.daoImpl;

import org.springframework.transaction.annotation.Transactional;

import biz.picosoft.entity.Contacte;
import dao.ContacteDao;

@Transactional(readOnly = false)
public class ContacteDaoImpl extends GenericDaoImp<Contacte> implements ContacteDao {

}

实体

package biz.picosoft.entity;

import java.io.Serializable;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name = "Contacte")
public class Contacte implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "idContact")
    int idContact;
    @Column(name = "nom")
    String nom;
    @Column(name = "mail")
    String mail;
    @Column(name = "téléphone")
    String téléphone;
    @Column(name = "adresse")
    String adresse;

    public Contacte() {
        super();
    }

    public Contacte(String nom, String mail, String téléphone, String adresse) {
        super();

        this.nom = nom;
        this.mail = mail;
        this.téléphone = téléphone;
        this.adresse = adresse;
    }

    public long getIdContact() {
        return idContact;
    }

    public void setIdContact(int idContact) {
        this.idContact = idContact;
    }

    public String getNom() {
        return nom;
    }

    public void setNom(String nom) {
        this.nom = nom;
    }

    public String getMail() {
        return mail;
    }

    public void setMail(String mail) {
        this.mail = mail;
    }

    public String getTéléphone() {
        return téléphone;
    }

    public void setTéléphone(String téléphone) {
        this.téléphone = téléphone;
    }

    public String getAdresse() {
        return adresse;
    }

    public void setAdresse(String adresse) {
        this.adresse = adresse;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + (int) (idContact ^ (idContact >>> 32));
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Contacte other = (Contacte) obj;
        if (idContact != other.idContact)
            return false;
        return true;
    }

}

我的主要

package biz.picosoft.mains;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.orm.hibernate5.LocalSessionFactoryBean;

import biz.picosoft.daoImpl.ContacteDaoImpl;
import biz.picosoft.entity.Contacte;

public class TestHibernate {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Contacte contacte = new Contacte("fatma", "test2", "test", "test");

        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        contacte.setIdContact(4);
        ContacteDaoImpl contacteDaoImpl = (ContacteDaoImpl) context.getBean("d");
        contacteDaoImpl.insert(contacte);

    }

}

2 个答案:

答案 0 :(得分:1)

如果您已在@Transactional上添加了@Transactional注释,并且在方法上添加了GenericDaoImp注释,则无需在所有DAO实施中添加@Transactional(readOnly = false)注释您只能获取数据的方法。这是唯一的建议,你的问题只会在

后解决

替换<property name="defaultAutoCommit" value="false" />
<property name="defaultAutoCommit" value="true" />

我已经尝试过并为我工作了。

答案 1 :(得分:0)

问题可能是您需要启用注释支持以及事务。尝试将以下内容添加到spring xml:

<context:annotation-config/>
<tx:annotation-driven />

仅供您参考:Why HibernateTemplate isn't recommended?