有人可以为网络应用程序建议DAO实现吗?
如果我为基本操作创建交易会有什么问题(例如findByID()
,findALL()
,createObject()
,deleteObject()
等?)
请建议支持延迟操作的DAO实现。
答案 0 :(得分:1)
如果您使用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;
}
}
答案 1 :(得分:0)
有三个主要选项:
1)在映射和查询中配置正确的延迟加载:这并不总是最简单的方法,因为在开发DAO时,您并不总是知道如何在表示层中使用对象。
2)使用OpenSessionInView模式:这样,您就可以在表示层中延迟加载相关对象。这可能是最简单的方法,因为它只需要一点点配置。但要小心,因为延迟加载可能非常昂贵,如果你在表示层中做了一些可疑的事情,你可能会遇到性能问题。您还可以从演示文稿中修改对象,这意味着更容易编写预编程错误。
3)添加一个将Hibernate对象转换为值对象的服务层:这是最细粒度的选项,因为您还可以限制wchi属性暴露给表示。您可以在服务调用周围保留事务边界,因此您可以确保在服务之外不会修改任何内容。
在所有情况下,您至少应该尝试正确配置延迟加载。否则,您可能会遇到性能问题!