框架:Struts 1.2, Hibernate 3
环境:MyEclipse 4.0
一. JDBC 连接字
某个测试站点从昨天中午忙活到今天上午,一直不知道因为何事不能从数据库 bookstore 的 account 表读出第一条记录。一直以为是程序的问题,可是把程序改到面目全非仍然是mappingForward到了“出错了”页面。
苦恼中打开 hibernate.cfg.xml ,赫然发现里面的 JDBC 连接字是:
jdbc:mysql://localhost/
webases
立马晕倒。改成 jdbc:mysql://localhost/
bookstore 这样就好了。
看来,
JDBC 连接字理应作为第一个排错的目标,尤其在 MyEclipse 环境里。
二. 用 HQL 和 createQuery 直接取出 PO 对象
如果 HQL 写成 select account from Account as account where account.name='admin'
这是会出错的,因为 select 后面不能直接跟对象名。用 Account 也是同样的错误。
如果 HQL 写成 select account.userid,account.name,account.password from Account as account where account.name='admin'
这也是错的,因为得出的 Quey 结果并不是 account 对象,而只能是逐个取值的数组。
只有当 HQL 写成 “
from Account as account where account.name='admin' ”
这时的 Query q.list().get(0) 才是一个 Account 类型的 PO 对象。
三. 在 JSP 上调试 createQuery 结果
可以在 JSP 页面上调试 Hibernate 的查询结果,以避开复杂的业务逻辑。
<% org.hibernate.Session s = HibernateSessionFactory.
currentSession();
String hql = " from Account where name='admin'";
try {
org.hibernate.Query query =
s.createQuery(hql);
out.println(query.getQueryString());
java.util.
List msgList = query.list();
Account account =
(Account) msgList.get(0);
out.println(account.getUserid());
out.println(account.getName());
out.println(account.getPassword());
} catch (org.hibernate.HibernateException e) {
e.printStackTrace();
}
HibernateSessionFactory.closeSession();
%>
四. 存取 Session
存:(Java)
session.setAttribute(Constants.USER_KEY,
account.getName());
这个 session 是 Hibernate 产生的 session。
取:(JSP)
我的用户名:
<%
String myname = (String)
session.getAttribute(Constants.USER_KEY);
out.println(myname);
%>