今天尝试做一个泛型的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>
希望老师们能指点指点,在这里谢过了
这是对整个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>
希望老师们能指点指点,在这里谢过了
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插入语句。
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操作,当然没数据了
可是我在ProductType.hbm.xml中映射时,主键是自动产生的啊, 如果要提供主键,您能具体说说例子 吗?
你配置了事务吗
例如:对那个类进行事务处理,并且要细化,还要对类中每个方法进行不同的事务管理策略!
例子在:spring的docs里面有 或者google spring事务可以找到很多
@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()方法的事务吧
<bean id="productTypeService"class="com.oa.model.service.impl.ProductTypeServiceBean">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>经鉴定,没有配置事务
<property name="hibernate.connection.autocommit">true</property>
结贴了,,,,谢谢