今天尝试做一个泛型的HibernateDAO,可是当我测试保存对象时,控制台有打印Insert语句,且没有任何报错,Junit也是呈现绿条,当我在数据库中查看时,却没有数据,再怎么插入一样,找了好久的错误都没法解决。希望老师们能指点指点。
这是对整个DAO的接口public interface DAO<T, ID extends Serializable> {
/**
 * 保存实体
 * @param entityClass 实体的类型
 * @param entity 需要保存的实体
 */
public void save(T entity);

/**
 * 更新实体
 * @param entityClass 实体的类型
 * @param entity
 */
public void update(T entity);
/**
 * 根据主键值删除实体
 * @param entity 被删除的实体
 */
public void delete(T entity);
/**
 * 删除实体组
 * @param entityIds 实体类数组
 */
public void delete(List<T>  entities);
/**
 * 根据主键值查找实体
 * @param entityClass 实体的类型
 * @param entityId 实体的ID
 * @return
 */
public T  findById( Class<T> entityClass,ID entityId);
/**
 * 查找所有实体
 * @param entityClass 实体类型
 * @return
 */
public List<T> findAll(Class<T> entityClass);

}DAO接口的抽象类:
public abstract class DaoImpl<T, ID extends Serializable> extends HibernateDaoSupport implements DAO<T, ID> { @Override
public void delete(T entity) {
getHibernateTemplate().delete(entity);
} @Override
public void delete(List<T> entities) {
getHibernateTemplate().deleteAll(entities);
} @Override
public void save(T entity) {
System.out.println(entity.toString());
getHibernateTemplate().saveOrUpdate(entity);
} @Override
public void update(T entity) {
getHibernateTemplate().save(entity); } @Override
public List<T> findAll(Class<T> entityClass) {
return (List<T>) getHibernateTemplate().find(
"from " + entityClass.getName()); } @Override
public T findById(Class<T> entityClass, ID entityId) {
return (T) getHibernateTemplate().get(entityClass, entityId); }
}这是我的applicationContext.xml配置文件<!-- 配置sessionFactory -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="configLocation">
<value>classpath:hibernate.cfg.xml</value>
</property>
</bean>
<!-- 配置事务管理 -->
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref bean="sessionFactory"/>
</property>
</bean>
         <bean id="productTypeService" class="com.oa.model.service.impl.ProductTypeServiceBean">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>这是领域模型 public class ProductType implements Serializable {
private static final long serialVersionUID = 7234906375106899518L;
/** 产品类别 **/
private Integer typeid;
/** 类别名称 **/
private String name;
/** 备注 ,用于谷歌搜索 **/
private String note;
/** 是否可见 ,默认是可见的 **/
private Boolean visible = true;
/** 所属父类别 **/
private ProductType parentType;
/**拥有的子类别**/
private Set<ProductType> childTypes;
        //  setXxx && getXxx()
}以及
映射文件 ProductType.hbm.xml<class name="com.oa.model.ProductType" table="t_producttype">
<id name="typeid" type="integer">
<generator class="native"/>
</id>
<property name="name"  type="string" length="36" not-null="false"/>
<property name="note" type="string" length="255" />
<property name="visible" type="boolean" not-null="false"/>
<set name="childTypes" inverse="true" access="field">
<key column="parentTypeid"/>
<one-to-many class="com.oa.model.ProductType"/>
</set>
</class>
 希望老师们能指点指点,在这里谢过了

解决方案 »

  1.   


    public interface ProductTypeService extends DAO {}
    我测试的就是ProductTypeService类,这是我的测试类
    ApplicationContext atx = new ClassPathXmlApplicationContext("applicationContext.xml"); 
    productTypeService = (ProductTypeService) atx.getBean("productTypeService");
    ProductType type = new ProductType("fine", "google find");
    productTypeService.save(type);保存type时,控制台有Insert插入语句。
      

  2.   

    我想可能是ProductType.hbm.xml的映射文件有配置错误,清你们帮我看看
      

  3.   

    @Override
        public void save(T entity) {
            System.out.println(entity.toString());
            getHibernateTemplate().saveOrUpdate(entity);
        }    @Override
        public void update(T entity) {
            getHibernateTemplate().save(entity);    }
    这两个方法里面,上面用save,下面用update,你现在这样,save的时候又没设主键值,每次save,数据库做的都是update操作,当然没数据了
      

  4.   


    可是我在ProductType.hbm.xml中映射时,主键是自动产生的啊, 如果要提供主键,您能具体说说例子 吗?
      

  5.   

    没报错,有数据,很显然是事务没commint;
    你配置了事务吗
      

  6.   

    声明式事务 配置事务管理器的同时,需要配置事务的管理属性的!默认是不管理的!
    例如:对那个类进行事务处理,并且要细化,还要对类中每个方法进行不同的事务管理策略!
    例子在:spring的docs里面有 或者google spring事务可以找到很多
      

  7.   

    没有配置事务属性!!google一下 或者可以查看spring官方文档
      

  8.   

    既然都会显示出insert语句 那基本断定是缓存没有flush()。(事务提交)
     @Override
        public void save(T entity) {
            System.out.println(entity.toString());
            getHibernateTemplate().saveOrUpdate(entity);
        }    @Override
        public void update(T entity) {
            getHibernateTemplate().save(entity);    }
    检查你上面的save()或saveOrUpdate()方法的事务吧
      

  9.   


     <bean id="productTypeService"class="com.oa.model.service.impl.ProductTypeServiceBean">
            <property name="sessionFactory" ref="sessionFactory"/>
        </bean>经鉴定,没有配置事务
      

  10.   

    感谢各位,我也想是事务的问题,刚开始以为spring默认自动可以提交事务,我在hibnernate.cfg.xml中显式的配置出来。就可以提交事务了
    <property name="hibernate.connection.autocommit">true</property>
    结贴了,,,,谢谢