0

getSession()onを使用していくつかの大きな問題が発生しましHibernateDaoSupportたが、修正しようとすると、次のような抽象クラスを作成し、すべての Dao を追加するのではなく、すべての Dao を拡張するのが正しいかどうか疑問に思っていましたSessionFactoryDao ?

そうである場合、この抽象 Dao クラスの Bean を作成し、それをセッション ファクトリに渡してから、他の Dao がそれを拡張すると機能しますか? それともそれは不可能ですか?

public abstract class AbstractDAOImpl<T> implements
        AbstractDAO<T> {

    private static Logger   _logger = LoggerFactory
                                    .getLogger(AbstractDAOImpl.class);
    private SessionFactory  factory;

    @Override
    public void refresh(final T object) {
        try {
            factory.getCurrentSession().refresh(object);
        } catch (Exception e) {
            _logger.error("Cannot refresh object " + object, e);
        }
    }

    @Override
    public void remove(final T object) {
        try {
            factory.getCurrentSession().delete(object);
        } catch (Exception e) {
            _logger.error("Cannot remove object " + object, e);
        }
    }

    @Override
    public void save(final T object) {
        try {
            factory.getCurrentSession().saveOrUpdate(object);
        } catch (Exception e) {
            _logger.error("Cannot save or update object " + object, e);
        }
    }

}
4

2 に答える 2

2
public interface RootDAO<T> extends Serializable {

    public List<T> loadAll();

    public T save(T entity);

    public void delete(T entity);

    public void markAsDeleted(T entity);

    public T get(Serializable id);

    public T load(Serializable id);

    public void saveOrUpdate(T entity);

    public void deleteAll(Collection<T> entities);

    public void saveOrUpdateAll(Collection<T> entities);

    public List<T> find(String hql);

    public void update(T entity);

    public T getByExampleUnique(T entity);

    public List<T> getByExampleList(T entity);

    public List<T> listAll();

    public Object execute(HibernateCallback action);

    public List<T> findByNamedParam(String queryString, String paramName,Object value);

    public List<T> findByNamedParam(String queryString, String[] paramNames,Object[] values);
    .
    .
    .
    .

}

@Component
public abstract class RootDAOImpl<T> extends HibernateDaoSupport implements RootDAO<T> {


    protected Logger logger = LoggerFactory.getLogger(getClass());
    private Class<T> clazz;

    @Autowired
    public void init(SessionFactory factory) {
        setSessionFactory(factory);
    }

    public RootDAOImpl(Class<T> clazz) {
        this.clazz = clazz;
    }

    public void delete(T entity) {
        getHibernateTemplate().delete(entity);
    }

    public void delete(String id) {
        getHibernateTemplate().delete(new FbUser(id));
    }

    public void markAsDeleted(T entity) {
        // Mark entity as deleted
        try {
            Method setDeletedMethod = clazz.getDeclaredMethod("setDeleted", Boolean.class);
            setDeletedMethod.invoke(entity, true);
            getHibernateTemplate().saveOrUpdate(entity);
        } catch (Exception e) {
            e.printStackTrace();
        }
        // actually delete
        // getHibernateTemplate().delete(entity);
    }

    @Override
    public void deleteAll(Collection<T> entities) {
        getHibernateTemplate().deleteAll(entities);
    }

    @Override
    public void saveOrUpdateAll(Collection<T> entities) {
        getHibernateTemplate().saveOrUpdateAll(entities);
    }

    @SuppressWarnings("unchecked")
    @Override
    public T get(Serializable id) {
        return (T) getHibernateTemplate().get(clazz, id);
    }

    @SuppressWarnings("unchecked")
    @Override
    public T load(Serializable id) {
        return (T) getHibernateTemplate().load(clazz, id);
    }

    @SuppressWarnings("unchecked")
    @Override
    public List<T> find(String hql) {
        return (List<T>) getHibernateTemplate().find(hql);
    }

    @Override
    public Object execute(HibernateCallback action) {
        return getHibernateTemplate().execute(action);
    }


    .
    .
    .

}

@Repository
public class UserDAOImpl extends RootDAOImpl<User> implements UserDAO{


    public UserDAOImpl() {
        super(User.class);
    }
}

DI フレームワークを使用していない場合は、SessionFactory の参照を保持し、DAO インスタンスを作成するときにそれを自分で渡す必要がある場合があります。

于 2011-05-12T08:51:38.763 に答える
1

これがまさに、人々が休止状態による JPA 実装を使用する理由です。可能な限り最良の設計パターンで SessionFactory を単独で活用する JPA の EntityManager の使用を開始する必要があります。ここで設計パターン全体を再発明する必要はありません。次の例に示すように、各 DAO で EntityManager の CRUD 操作を使用するだけです。実装をよろしくお願いします。

http://www.myhomepageindia.com/index.php/2009/04/02/jpa-hibernate-with-oracle-on-eclipse.html

于 2011-05-12T00:05:57.160 に答える