前 两周做电子商务的实习项目的时候遇到一个很棘手的问题:首页要做一个商品目录,每个商品大类下面还分几个小类。大类和小类之间的关系也就是 Parent/Child 的关系。当时也是初学 Struts ,被这个问题搅了两天也没搞定,最后用了个特别笨的方法给凑合过去了:jsp页面里调用一个 JavaBean ,这个 JavaBean 在初始化的时候从数据库中读出所有大类,并把这些大类放到一个 ArrayList 中,在jsp中用 logic:iterator 输出所有大类,logic:iterator内部先调用另一个 JavaBean 得到该大类下所有小类,然后嵌套了另一个 logic:iterator 输出小类。我不准备把代码贴出来了,实在是因为代码写的太烂了。
看了几天Hibernate的书,今天就拿这个问题开刀,算是巩固一下这几天的学习成果吧。OK,我们开始!
先建数据库和数据表:表结构如下:
id int PK (编号)
name varchar(20) (类别名)
parentid int (父类的编号)
再在eclipse中新建一个名为 pc 的 web 项目(偶用的是myeclipse做 web 项目)。下面是 Hibernate 的配置方法和 Struts、JSP的代码
Hibernate配置文件:hibernate.cfg.xml
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"
http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<!-- Generated by MyEclipse Hibernate Tools. -->
<hibernate-configuration>
<session-factory>
<property name="connection.username">study</property>
<property name="connection.url">jdbc:sqlserver://localhost:1433</property>
<property name="dialect">org.hibernate.dialect.SQLServerDialect</property>
<property name="myeclipse.connection.profile">news</property>
<property name="connection.password">study</property>
<property name="connection.driver_class">com.microsoft.sqlserver.jdbc.SQLServerDriver</property>
<property name="show_sql">true</property>
<mapping resource="name/yinqiang/pc/hibernate/Pc.hbm.xml" />
</session-factory>
</hibernate-configuration>
Hibernate映射文件:Pc.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"
http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!--
Mapping file autogenerated by MyEclipse - Hibernate Tools
-->
<hibernate-mapping>
<class name="name.yinqiang.pc.hibernate.Pc" table="pc" schema="dbo" catalog="news">
<id name="id" type="integer">
<column name="id" />
<generator class="native"></generator>
</id>
<property name="name" type="string">
<column name="name" length="50" not-null="true" />
</property>
<property name="parentid" type="integer">
<column name="parentid" not-null="true" />
</property>
<set
inverse="true"
lazy="true"
name="child">
<key column="parentid" />
<one-to-many class="name.yinqiang.pc.hibernate.Pc" />
</set>
</class>
</hibernate-mapping>
这里面的红字部分是配置文件的核心内容,它定义了parentid和id之间的关系
Hibernate持久化类:Pc.java
package name.yinqiang.pc.hibernate;
import java.util.HashSet;
import java.util.Set;
public class Pc implements java.io.Serializable {
private static final long serialVersionUID = 2764441994073705343L;
private Integer id;
private String name;
private Integer parentid;
private Set child = new HashSet(0);
// Constructors
/** default constructor */
public Pc() {
}
/** minimal constructor */
public Pc(String name, Integer parentid) {
this.name = name;
this.parentid = parentid;
}
/** full constructor */
public Pc(String name, Integer parentid, Set child) {
this.name = name;
this.parentid = parentid;
this.child = child;
}
// Property accessors
public Integer getId() {
return this.id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
public Integer getParentid() {
return this.parentid;
}
public void setParentid(Integer parentid) {
this.parentid = parentid;
}
public Set getChild() {
return this.child;
}
public void setChild(Set child) {
this.child = child;
}
}
Hibernate的部分基本都配置完成了,下面新建一个Struts的Action:
Struts配置文件:struts-config.xml(action-mappings部分)
<action-mappings >
<action
input="/index.jsp"
path="/showtree"
type="name.yinqiang.pc.action.ShowtreeAction"
validate="false">
<forward name="success" path="/showtree.jsp" />
</action>
</action-mappings>
ShowtreeAction.java(execute方法的代码)
public ActionForward execute(
ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response) {
Session session = HibernateSessionFactory.currentSession();
Transaction tx = session.beginTransaction();
List list = session.createQuery("from Pc pc where pc.parentid=0").list();
tx.commit();
Iterator it = list.iterator();
while(it.hasNext()){
Pc pc = (Pc)it.next();
pc.getChild().iterator();
}
HibernateSessionFactory.closeSession();
request.setAttribute("list",list);
return mapping.findForward("success");
}
红字的部分如果不写话在打开jsp页面的时候就会出错,至于为什么要这样写、是不是应该这样写我也不太清楚(刚开始学Hibernate,还很菜,好多问题都还没弄明白)
OK,最后一步,用于显示数据的JSP文件:showtree.jsp
<logic:present name="list" scope="request">
<c:forEach items="${list}" var="element">
<p>大类:<html:link page="/classinfo.do?id=${element.id}">${element.name}</html:link><br />
<c:forEach items="${element.child}" var="child">
小类:<html:link page="/classinfo.do?id=${child.id}">${child.name}</html:link>
</c:forEach>
</p>
</c:forEach>
</logic:present>
这里用的是JSTL标签循环遍历集合。内层的循环输出一个父类下的所有子类,外层循环输出所有的父类。
完工了,deploy一下这个项目,打开浏览器,输入地址:http://localhost:8080/pc/showtree.do 可不要直接输入jsp文件的地址哦!
HaHa,成功了!!
注:写的比较多也比较乱,其实核心内容就在于Hibernate映射文件的配置和Struts Action部分的代码。如果有朋友不明白的话欢迎和我交流。
相关推荐
例如,在上面的代码片段中,通过`left outer join fetch parent.childs`语句,我们告诉Hibernate在加载`Parent`实体时,也一并加载所有相关的`Child`实体。这样,即使`Parent`实体的`childs`属性被标记为`lazy="true...
在Java世界中,Hibernate是一个非常流行的ORM(对象关系映射)框架,它允许开发者使用面向对象的方式来操作数据库,极大地简化了数据库操作。本教程将深入探讨如何在Hibernate中使用注解来实现实体类的配置,特别是...
本文将深入探讨Hibernate中的组件映射,包括使用注解(Annotation)和XML配置两种方式,以帮助开发者更好地理解和应用这一功能。 一、Hibernate组件映射基础 组件映射是Hibernate中的一种特性,允许我们将一个类的...
Hibernate 是一个开源的对象关系映射(ORM)框架,它允许开发者使用面向对象的方式来操作数据库,极大地简化了Java应用与数据库之间的交互。在Hibernate中,组件映射是将一个类的实例作为另一个类的一个属性进行持久...
6. **数据操作**:完成上述配置后,我们可以通过Hibernate的Session接口进行CRUD操作,例如添加新的`Parent`及其关联的`Child`对象,或者查询包含子对象的父对象等。 7. **级联操作**:为了简化操作,可以设置`@...
为了解决这个问题,可以有以下几种策略: 1. 将查询范围扩大,避免在Session关闭后访问懒加载属性。 2. 使用Open Session In View模式,将Session的生命周期扩展到整个HTTP请求,但此方法可能带来事务管理和性能问题...
21. 示例:父子关系(Parent Child Relationships) 21.1. 关于collections需要注意的一点 21.2. 双向的一对多关系(Bidirectional one-to-many) 21.3. 级联生命周期(Cascading lifecycle) 21.4. 级联与未保存值...
21. 示例:父子关系(Parent Child Relationships) 21.1. 关于collections需要注意的一点 21.2. 双向的一对多关系(Bidirectional one-to-many) 21.3. 级联生命周期(Cascading lifecycle) 21.4. 级联与未保存值...
21. 示例:父子关系(Parent Child Relationships) 21.1. 关于collections需要注意的一点 21.2. 双向的一对多关系(Bidirectional one-to-many) 21.3. 级联生命周期(Cascading lifecycle) 21.4. 级联与未保存值...
在使用双向关联时,要特别注意Session的生命周期,避免出现脏读、不可重复读或幻读等并发问题。适时调用`Session.clear()`或`Session.flush()`可以帮助管理对象状态。 10. **性能优化** 虽然双向关联提供了便利,...
21. 示例:父子关系(Parent Child Relationships) 21.1. 关于collections 21.2. 双向的一对多关系(Bidirectional one-to-many) 21.3. 级联生命周期(Cascading lifecycle) 21.4. 级联与未保存值(Cascades and ...
然后,使用Hibernate的注解来声明这些关联,如`@OneToMany`和`@ManyToOne`。 在配置文件中,我们还需要为这个关联定义映射规则,包括fetch策略(选择是懒加载还是立即加载子项)、级联操作(如删除时是否一同删除...
5. 创建和使用`maven_parent`:在实际操作中,你需要在Maven仓库中创建一个名为`maven-parent`的POM文件,包含所有共用的配置。然后在子项目的POM中,通过`<parent>`标签指定父POM的groupId、artifactId和version。...
示例:父子关系(Parent Child Relationships) 16.1. 关于collections 16.2. 双向的一对多关系(Bidirectional one-to-many) 16.3. 级联生命周期(Cascading lifecycle) 16.4. 级联更新(Using ...
在Java世界中,Hibernate是一个非常流行的ORM(对象关系映射)框架,它允许开发者使用面向对象的方式来操作数据库,而无需关心底层SQL语句。在Hibernate 3.0版本中,虽然XML配置文件仍然是主要的配置方式,但已经...
21. 示例:父子关系(Parent Child Relationships) 21.1. 关于collections需要注意的一点 21.2. 双向的一对多关系(Bidirectional one-to-many) 21.3. 级联生命周期(Cascading lifecycle) 21.4. 级联与未保存值...
21. 示例:父子关系(Parent Child Relationships) 21.1. 关于collections需要注意的一点 21.2. 双向的一对多关系(Bidirectional one-to-many) 21.3. 级联生命周期(Cascading lifecycle) 21.4. 级联与未保存值...
但同时,过度使用`cascade`可能导致数据一致性问题,因为可能会在不经意间修改或删除关联数据。因此,在设计时需要权衡其利弊,根据业务需求来选择合适的`cascade`策略。 总的来说,`Hibernate cascade`是一个强大...
本压缩软件集中了大量的Hibernate资料,目录如下: 1. Hibernate入门;...21. 示例:父子关系(Parent Child Relationships); 22. 示例:Weblog 应用程序; 23. 示例:复杂映射实例; 24. 最佳实践(Best Practices);
1. Hibernate入门 1.1. 前言 1.2. 第一部分 - 第一个Hibernate应用程序 1.2.1. 第一个class 1.2.2. 映射文件 1.2.3. Hibernate配置 1.2.4. 用Ant构建 1.2.5. 启动和辅助类 1.2.6. 加载并存储对象 1.3. 第...