任何人都可以提出一个Web应用程序的DAO实现吗?休眠DAO实现
会有什么问题,如果我创建一个基本动作的交易(例如findByID()
,findALL()
,createObject()
,deleteObject()
等)?
请表明支持懒惰操作的DAO实现。
任何人都可以提出一个Web应用程序的DAO实现吗?休眠DAO实现
会有什么问题,如果我创建一个基本动作的交易(例如findByID()
,findALL()
,createObject()
,deleteObject()
等)?
请表明支持懒惰操作的DAO实现。
如果使用Hibernate Tools可以生成代码的基本DAO将自动为您生成。你可以建立在他们身上。
总之,我使用交易的一些代码片段:
public void executeTransaction(Object[] parameters, Transact transact) throws ApplicationException
{
Transaction tx = null;
try
{
tx = HibernateSessionFactory.getSession().beginTransaction();
transact.execute(parameters, tx);
tx.commit();
LOG.trace("executeTransaction() success");
}
catch (Exception e)
{
rollback(tx);
throw new ApplicationException(e);
}
}
private void rollback(Transaction tx) throws ApplicationException
{
LOG.warn("rollback()");
if (tx != null)
{
try
{
tx.rollback();
}
catch (Exception ex)
{
LOG.error("rollback() failure",ex);
}
}
}
public interface Transact
{
public void execute(Object[] parameters, Transaction tx) throws Exception;
}
void updateDistrictImpl(final Distretto district) throws ApplicationException, ApplicationValidationException
{
try
{
LOG.trace("updateDistrict[" + distrettoToString(district) + "]");
executeTransaction(new Transact() {
public void execute(Object[] parameters, Transaction tx) throws ApplicationException
{
DistrettoHome DistrettoDAO = new DistrettoHome();
DistrettoDAO.attachDirty(district);
}
});
LOG.info("updateDistrict[" + distrettoToString(district) + "] success!");
}
catch (ApplicationException e)
{
LOG.error("updateDistrict() exception: " + e.getLocalizedMessage(), e);
throw e;
}
}
主要有3个选项:
1)配置正确延迟加载在你的映射,并在查询:这是不是总是最简单的方法,因为在开发DAO时,您始终不知道如何在表示层中使用对象。
2)使用OpenSessionInView模式:通过这种方式,你将能够在表示层延迟加载相关的对象。这可能是最简单的方法,因为它只需要一点点配置。但要小心,因为延迟加载可能会非常昂贵,并且如果在表示层中执行某些操作可能会遇到性能问题。您也可以从演示文稿修改对象,这意味着更容易发生编程错误。
3)添加你的Hibernate对象转换为值对象服务层:这是最细粒度的选择,因为你还可以限制wchi特性暴露到演示文稿。您在服务调用周围保留事务边界,因此您确信在服务之外不会有任何修改。
在任何情况下,你至少应该尝试正确配置懒加载。否则,你可能会遇到性能问题!
我有懒intialization – user93796 2009-04-23 12:43:15