锁定老帖子 主题:Spring的DAO设计实践
精华帖 (0) :: 良好帖 (0) :: 新手帖 (1) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2004-10-19
robbin 写道 HibernateTemplate封装的并不完整,例如我要Query对象,拿不到,我要多个命名参数的iterator,没有,我要设置分页,不提供!你怎么办?都用HibernateCallBackup()?Spring的作用不是把Hibernate再封装一层,让你接触不到Hibernate的API,而是帮助你管理好Session和Transaction。hibernateTemplate只不过帮你剩几行代码而已,他没有完整的封装也无法取代Hibernate原生API。
HibernateCallBackup不错呀,我觉得用起来很方便,我自己封装也是用回调做的 |
|
返回顶楼 | |
发表时间:2004-10-19
lllyq 写道 那我建议看看Confluence,可借鉴的地方多了去了。 Confluence不是开源呀!? |
|
返回顶楼 | |
发表时间:2004-10-19
robbin 写道 HibernateTemplate封装的并不完整,例如我要Query对象,拿不到,我要多个命名参数的iterator,没有,我要设置分页,不提供!你怎么办?都用HibernateCallBackup()?Spring的作用不是把Hibernate再封装一层,让你接触不到Hibernate的API,而是帮助你管理好Session和Transaction。hibernateTemplate只不过帮你剩几行代码而已,他没有完整的封装也无法取代Hibernate原生API。
谁说的? public List getListNewer(); { return getHibernateTemplate();.executeFind(new HibernateCallback(); { public Object doInHibernate(Session session); throws HibernateException, SQLException { Query query = session .createQuery("from Blog as b where b.status=1 order by b.createdOn desc");; query.setMaxResults(Global.RANGE_NEWER.intValue(););; query.setFirstResult(0);; return query.list();; } });; } 够用吗? |
|
返回顶楼 | |
发表时间:2004-10-19
引用 你怎么办?都用HibernateCallBackup()?
你没有看清楚我说的话吗?都像你那样用每个都要定义一个内部类去操作,你累不累阿?代码难看死了。 |
|
返回顶楼 | |
发表时间:2004-10-19
robbin 写道 你没有看清楚我说的话吗?都像你那样用每个都要定义一个内部类去操作,你累不累阿?代码难看死了。 使用内部类代码难看?我倒觉得callback很清晰,而且事务不用你自己管。 个人喜好问题吧。 |
|
返回顶楼 | |
发表时间:2004-10-19
intolong 写道 lllyq 写道 那我建议看看Confluence,可借鉴的地方多了去了。 Confluence不是开源呀!? 把它反编译就可以了.用JAD会有些类乱掉,但可以看到程序的逻辑思想就够了. |
|
返回顶楼 | |
发表时间:2004-10-19
引用 dhj1:正在做个程序生成器,自动跟据表名的集合,生成一个bean.xml配置.
我想这样使用: EntryStructure es = DBSchema.CreateEntryStructure("tableName");; DAO dao = es.createDAO();; VO vo = es.creaeteVO();; ... vo.setXXX();; .... dao.insert(vo);; dao.update(vo,new Match(...););; dao.delete(vo,new Match(...); ); Iterator iter = dao.select(new Match(...););; 其中Match用来描述条件 DBSchema可以考虑从你的xml来构造,也可以从连接直接来(或者这样一次生成你的xml)。不过反正我不想在这事情上操作什么xml。至少不要强迫我只能这么做。 我不想表结构每变一次,就重新编译的一次我的东西。 |
|
返回顶楼 | |
发表时间:2004-10-24
在spring中,定制的DAO要继承使用HibernateDaoSupport让我感到不快,难道就不能采用引用的方式?既然,hibernate 中 session 是ThreadLocal,那所有DAO中的function就可以是static,这样写TestCase是麻烦了,没有DAO接口了,但你也可以把static function 看作接口来用,毕竟用起来爽啊!DAO都不必new了,说不定性能都能得到提升,
|
|
返回顶楼 | |
发表时间:2004-10-24
You can use static methods for data access. But how can you manage your DAO's session life cycle?
I thing the most important thing for a DAO class is session management. It's complex, and you need to look after it very careful. |
|
返回顶楼 | |
发表时间:2004-10-24
引用 http://www.gpowersoft.com/tech/Spring/39.htm
这里有篇如何设计DAO来良好利用Spring的Hibernate支持类的文章,我觉得挺不错,推荐一下。 这个DAO里并没有调用HibernateTemplate的execute()方法,而且没有写再什么时候关闭session,而且直接忽略了下面的代码: 引用 Session session = (!isAllowCreate() ?
SessionFactoryUtils.getSession(getSessionFactory(), false) : SessionFactoryUtils.getSession(getSessionFactory(), getEntityInterceptor(), getJdbcExceptionTranslator())); boolean existingTransaction = TransactionSynchronizationManager.hasResource(getSessionFactory()); if (!existingTransaction && getFlushMode() == FLUSH_NEVER) { session.setFlushMode(FlushMode.NEVER); } 这样的话就存在很大的漏洞,如果有很多线程的话,那不就是要打开很多session吗?所以我觉得即使是用BaseDAO继承HibernateDaoSupport仍然需要调用spring的execute方法 |
|
返回顶楼 | |