spring与hibernate注解及XML方式集成

spring与hibernate注解及XML方式集成

Hibernate Xml方式

该种方式需要在sessionFactory中引入对应的hbm.xml文件,样例如下:

  <!-- spring-hibernate 整合 -->
    <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
        <property name="hibernateProperties">
            <value>
                hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
                hibernate.jdbc.batch_size=25
                hibernate.jdbc.fetch_size=50
                hibernate.show_sql=true
            </value>
        </property>
        <property name="dataSource" ref="dataSource" />
        <property name="mappingLocations">
            <list>
                <value>classpath:/META-INF/gls.hibernate/User.hbm.xml</value>
                <value>classpath:/META-INF/gls.hibernate/Customer.hbm.xml</value>
                <value>classpath:/META-INF/gls.hibernate/BatchTransaction.hbm.xml</value>
                <value>classpath:/META-INF/gls.hibernate/PolicyTransaction.hbm.xml</value>
                <value>classpath:/META-INF/gls.hibernate/Policy.hbm.xml</value>
                <value>classpath:/META-INF/gls.hibernate/Email.hbm.xml</value>
                <value>classpath:/META-INF/gls.hibernate/BatchJobChunk.hbm.xml</value>
            </list>
        </property>
    </bean>

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

    <tx:annotation-driven transaction-manager="transactionManager" />

对于其他的DAO及其Service层,不做阐述了,不过对于DAO和Service建议建立BaseDao和BaseService使用泛型操作对应的model。

栗子来啦:

BaseDao

/**
 * baseDao class用于数据的CRUD操作
 * @author daniel.zhao
 *
 * @param <T>
 */
public interface BaseDao<T> {
    public void save(T entity);
    public void saveOrUpdate(T entity);
    public void update(T entity);
    public void delete(Serializable id);
    public T findById(Serializable id);
    public List<T> findByHql(String hql, Object...params);
    public List<T> findByHqlLimit(String hql, final Long start, final Long limit, Object...params);
}

DaoSupport

public class DaoSupport<T extends Serializable> implements BaseDao<T> {

    public static final Logger logger = LoggerFactory.getLogger(DaoSupport.class);
    
    private Class<T> clazz;
    
    @Autowired
    private SessionFactory sessionFactory;
    
    /**
     * 构造方法
     */
    public DaoSupport() {
        ParameterizedType type = (ParameterizedType) this.getClass().getGenericSuperclass();
        clazz = (Class<T>) type.getActualTypeArguments()[0];
        logger.info("BaseDao quety entity class: " + clazz.getName());
    }
    
    public Session getSession() {
        return sessionFactory.getCurrentSession();
    }

    @Override
    public void save(T entity) {
        this.getSession().save(entity);
    }

    @Override
    public void saveOrUpdate(T entity) {
        this.getSession().saveOrUpdate(entity);
    }

    @Override
    public void update(T entity) {
        this.getSession().update(entity);
    }

    @Override
    public void delete(Serializable id) {
        this.getSession().delete(this.findById(id));
    }

    @Override
    public T findById(Serializable id) {
        return (T) this.getSession().get(this.clazz, id);
    }

    @Override
    public List<T> findByHql(String hql, Object... params) {
        Query query = this.getSession().createQuery(hql);
        for (int i = 0; params != null && i < params.length; i++) {
            query.setParameter(i, params[i]);
        }
        return query.list();
    }

    @Override
    public List<T> findByHqlLimit(String hql, Long start, Long limit, Object... params) {
        Query query = this.getSession().createQuery(hql);
        for (int i = 0; params != null && i < params.length; i++) {
            query.setParameter(i, params[i]);
        }
        query.setFirstResult(start.intValue());
        query.setMaxResults(limit.intValue());
        return query.list();
    }
}

BaseService

public interface BaseService<T> {
    public void save(T entity);
    public void saveOrUpdate(T entity);
    public void update(T entity);
    public void delete(Serializable id);
    public T findById(Serializable id);
    public List<T> findByHql(String hql, Object...params);
    public List<T> findByHqlLimit(String hql, final Long start, final Long limit, Object...params);
}

BaseServiceImpl

@Transactional
public class BaseServiceImpl<T> implements BaseService<T> {

    private BaseDao<T> dao;
    
    @Resource
    public void setDao(BaseDao<T> dao) {
        this.dao = dao;
    }
    
    @Override
    public void save(T entity) {
        dao.save(entity);
    }

    @Override
    public void saveOrUpdate(T entity) {
        dao.saveOrUpdate(entity);
    }

    @Override
    public void update(T entity) {
        dao.update(entity);
    }

    @Override
    public void delete(Serializable id) {
        dao.delete(id);
    }

    @Override
    public T findById(Serializable id) {
        return dao.findById(id);
    }

    @Override
    public List<T> findByHql(String hql, Object... params) {
        return dao.findByHql(hql, params);
    }

    @Override
    public List<T> findByHqlLimit(String hql, Long start, Long limit, Object... params) {
        return dao.findByHqlLimit(hql, start, limit, params);
    }

}

 注解方式

 Hibernate Entity

@Entity
@Table(name = "t_user")
public class User implements Serializable {
    /**
     * 
     */
    private static final long serialVersionUID = -9042615274714038279L;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @Column(name = "name")
    private String name;

    @Column(name = "password")
    private String password;

    @Column(name = "age")
    private Integer age;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name == null ? null : name.trim();
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password == null ? null : password.trim();
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }
    
    @Override
    public String toString() {
        return "User[id=" + id + ", name=" + name + ",age=" + age + "]";
    }
}

Hibernate Xml

  <!-- spring-hibernate 整合 -->
    <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
        <property name="hibernateProperties">
            <value>
                hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
                hibernate.jdbc.batch_size=25
                hibernate.jdbc.fetch_size=50
                hibernate.show_sql=true
            </value>
        </property>
        <property name="dataSource" ref="dataSource" />
        <property name="annotatedClasses">
            <list>
                <value>com.ebao.life.model.User</value>
            </list>
        </property>
    </bean>

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

    <tx:annotation-driven transaction-manager="transactionManager" />

Junit Test

@RunWith(JUnit4ClassRunner.class)
@TransactionConfiguration(transactionManager = "transactionManager", defaultRollback = false)
@ContextConfiguration(classes = { PropertyConfig.class, DataSourceConfig.class, HibernateAnnotationConfig.class })
public class HibernateAnnotationTest {

    public static final Logger logger = LoggerFactory.getLogger(HibernateAnnotationTest.class);
    
    @Resource(name = UserService.BEAN_DEFAULT)
    private UserService userService;
    
    @Test
    public void testInsert() {
        User user = new User();
        user.setName("daniel-zhao-001");
        user.setPassword("password");
        user.setAge(28);
        userService.save(user);
    }
}
原文地址:https://www.cnblogs.com/redcool/p/6506738.html