两个对象
public class Manager {
private Integer id; //管理员ID号
private String name; //管理员名称
private String pwd; //管理员密码
private Purview purview;
省略set和get方法
}public class Purview {
private Integer id;
private int sysset=0; //系统设置权限
private int readerset=0; //读者管理权限
private int bookset=0; //图书管理权限
private int borrowback=0; //图书借还权限
private int sysquery=0; //系统查询权限
private Manager manager;
省略set和get方法}方法query_p
public Manager query_p(String str) {
String hql = "select m.*,p.sysset,p.readerset,p.bookset,p.borrowback,p.sysquery from Manager m
left join Purview p on m.id=p.id where m.name='"+str+"'";
Manager manager1 = (Manager)this.getHibernateTemplate().find(hql).get(0);
return manager1;
}
我写这个方法返回Manager类型,但是不对
问:应该怎么写,才能实现联合查询返回Manager,Manager类里的purview也要有值。
public class Manager {
private Integer id; //管理员ID号
private String name; //管理员名称
private String pwd; //管理员密码
private Purview purview;
省略set和get方法
}public class Purview {
private Integer id;
private int sysset=0; //系统设置权限
private int readerset=0; //读者管理权限
private int bookset=0; //图书管理权限
private int borrowback=0; //图书借还权限
private int sysquery=0; //系统查询权限
private Manager manager;
省略set和get方法}方法query_p
public Manager query_p(String str) {
String hql = "select m.*,p.sysset,p.readerset,p.bookset,p.borrowback,p.sysquery from Manager m
left join Purview p on m.id=p.id where m.name='"+str+"'";
Manager manager1 = (Manager)this.getHibernateTemplate().find(hql).get(0);
return manager1;
}
我写这个方法返回Manager类型,但是不对
问:应该怎么写,才能实现联合查询返回Manager,Manager类里的purview也要有值。
public Manager query_p(String str) {
String hql="from Manager where name="+str;
Manager manager = (Manager)this.getHibernateTemplate().find(hql).get(0);
manager1.getPurview();
return manager;
}
红色的地方我没有判断,应该判断是不是为空和size是不是>0
也就是Manager的po里面要有Purview的属性。看是一对一还是一对多或是多对多,反正要有Purview。
Manager的映射文件里也要有Purview关联。然后在hql时直接这样写:
from Manager m join fetch m.purview p where m.name='"+str+"'";
这里的m.purview说是你Manager里的属性purview 或是purviews
这句话根本运行不过去,我配置的是一对一主键映射
System.out.println("_________________");
但是没有输出
Hibernate: select manager0_.id as id6_, manager0_.name as name6_, manager0_.pwd as pwd6_ from h_manager manager0_ where manager0_.name='admin'
Hibernate: select purview0_.id as id9_0_, purview0_.sysset as sysset9_0_, purview0_.readerset as readerset9_0_, purview0_.bookset as bookset9_0_, purview0_.borrowback as borrowback9_0_, purview0_.sysquery as sysquery9_0_ from h_purview purview0_ where purview0_.id=?
hql=from Manager m join fetch m.purview p where m.id=1
2012-3-25 21:34:59 org.apache.catalina.core.ApplicationDispatcher invoke
严重: Servlet.service() for servlet jsp threw exception
java.lang.NullPointerException
at net.dbet.booksystem.dao.ManagerDAO.query_p(ManagerDAO.java:85)
at org.apache.jsp.main_jsp._jspService(main_jsp.java:129)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:374)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:630)
at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:436)
at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:374)
Purview.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
<hibernate-mapping>
<class name="net.dbet.booksystem.vo.Purview" table="h_purview">
<id name="id">
<generator class="foreign">
<param name="property">manager</param>
</generator>
</id>
<property name="sysset"/>
<property name="readerset"/>
<property name="bookset"/>
<property name="borrowback"/>
<property name="sysquery"/>
<one-to-one name="manager" constrained="true"/>
</class>
</hibernate-mapping>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
<hibernate-mapping>
<class name="net.dbet.booksystem.vo.Manager" table="h_manager">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<property name="pwd"/>
<one-to-one name="purview" fetch="join"/>
</class>
</hibernate-mapping>
at net.dbet.booksystem.dao.ManagerDAO.query_p(ManagerDAO.java:85)出现空指针了。是不是根据这样的条件没查出值出来,然后你直接get(0)时出现的空指针?你这样写:
List<Manager> managerList = this.getHibernateTemplate().find(hql);然后 Manager manager1 = managerList.get(0);
public Manager query_p(String str) {
String hql="from Manager where name=?";
Manager manager = (Manager)this.getHibernateTemplate().find(hql,str).get(0);
manager1.getPurview();
return manager;
}
这样写也是空异常?
Manager manager = managerList.get(0);
这样写还是一样的错误啊
public Manager query_p(String str) {
String hql="from Manager where name=?";
Manager manager = (Manager)this.getHibernateTemplate().find(hql,str).get(0);
manager1.getPurview();
return manager;
}
这样写也是空异常那个HibernateTemplate注入进来了
其他语句有正确运行了啊
1、确定dataSource已经成功注入
2、确定dao成功被注入
3、Manager manager = (Manager)this.getHibernateTemplate().find(hql).get(0);你这样直接写,强制转换,如果没有数据,明显会报转换错误或者空指针。
HibernateTemplate怎么注入啊?
我是整合ssh框架
如果是hibernateTemplate:
<bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
<property name="sessionFactory" ref="sessionFactory" />
</bean><bean id="managerDAO" class="net.dbet.booksystem.dao.ManagerDAO">
<property name="hibernateTemplate" ref="hibernateTemplate" />
</bean>sessionFactory同理,记得写set方法
就需要<bean id="managerDAO" class="net.dbet.booksystem.dao.ManagerDAO">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<!-- 配置sessionFactory -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="configLocation">
<value>classpath:hibernate.cfg.xml</value>
</property>
</bean>
<!-- 配置事务管理器 -->
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref bean="sessionFactory"/>
</property>
</bean>
<!-- 配置事务的传播特性 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="search*" propagation="SUPPORTS"/>
<tx:method name="*" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>
<!-- 那些类的哪些方法参与事务 -->
<aop:config>
<aop:pointcut expression="execution(* net.dbet.booksystem.*.*(..))" id="cut"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="cut"/>
</aop:config>
<property name="managerDAO" ref="managerDAO"/>
</bean>
<bean id="managerDAO" class="net.dbet.booksystem.dao.ManagerDAO">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
<!-- 那些类的哪些方法参与事务 -->
<aop:config>
<aop:pointcut expression="execution(* net.dbet.booksystem.*.*(..))" id="cut"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="cut"/>
</aop:config>
现在改过来了 控制台没错误,但是页面出错了,在方法里没有输出
我第一次整合ssh框架,哎
<bean id="managerAction" class="net.dbet.booksystem.action.ManagerAction">
<property name="managerDAO" ref="managerDAO"/>
</bean>
这里要把manager(managerAction里的private Manager manager)注入进去吗?
要写getter/setter。Manager是po,不用注入的。