日期:2014-05-16  浏览次数:20402 次

数据库访问层Dao业务逻辑小记录(二)

我比较喜欢海蓝色,海蓝天蓝,心情海蓝,希望我坚持下来,以前没有即时的记录,过去这么久了,才拼命的去回忆,思路会有断痕,有褶皱。

在具体实现由Dao层定义的接口时,我采用的是JPA规范,JPA全称叫Java持久化API,百度百科说JPA通过JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。理解它,需要实践它。

1.同样在base包下新建抽象类DaoSupport.class,并实现接口Dao。由于是使用了JPA规范,所以加入注解Transicational,作用是为类中的方法加入事物。

?

View Code
/**
    默认:方法被加入事物,传播行为:Propagation.REQUIRED
*/
@Transactional
public abstract class DaoSupport implements DAO {
}

2.注入实体管理其,EntityManager对象,通过注解PersistenceContext

?

View Code
    // 注入EntityManager
    @PersistenceContext
    protected EntityManager em;

3.实现具体的方法时,可直接使用EntityManager 提供的内置方法,也可以通过sql语句来实现,这里使用前者。

4.简要记录:保存对象-->persist(含有很好理解,使对象持久化的存储),删除数据,通过id找到具体对象,在remove。设计到,remove,和getReference方法。

更新对象(数据)--> merger,可理解为使对象状态由游离状态合并(merge)为持久化状态。由于DaoSupport是抽象类,所以子类只需要继承该类,便可以直接调用这些方法,不需要再重写。

?

View Code
/**
     * 执行过程 AOP编程,方法入口:em被注入值(实例化),打开事物,事物操作,关闭操作
     */
    @Override
    public void save(Object entity) {
        em.persist(entity);
        
    }

    @Override
    public void update(Object entity) {

        em.merge(entity);
    }

    @Override
    public <T> void delete(Class<T> entityclazz, Object... entityids) {

        for (Object id : entityids) {
            em.remove(em.getReference(entityclazz, id));
        }
    }
View Code

@Transactional(readOnly = true, propagation = Propagation.NOT_SUPPOR