在Struts和Hibernate之间搭起桥梁

王朝other·作者佚名  2008-05-31
窄屏简体版  字體: |||超大  

摘要

Hibernate和struts是当前市面上几个最流行的开源的库之一。它们很有效率,是程序员在开发Java企业应用,挑选几个竞争的库的首选。虽然它们经常被一起应用,但是Hibernate的设计目标并不是和Struts一起使用,而Struts在Hibernate诞生好多年之前就发布了。为了让它们在一起工作,仍然有很多挑战。这篇文章点明了Struts和Hibernate之间的一些鸿沟,尤其关系到面向对象建模方面。文章也描述了如何在两者间搭起桥梁,给出了一个基于扩展Struts的解决方案。所有的基于Struts和Hibernate构建的Web应用都能从这个通用的扩展中获益。

在Hibernate in Action(Manning,2004十月)这本书里,作者Christian Bauer和Gavin King揭示了面向对象世界的模型和关系数据模型,两个世界的范例是不一致的。Hibernate非常成功地在存储层(persistence Layer)将两者粘合在一起。但是领域模型(domain model)(也就是Model-View-Controller的model layer)和Html页面(MVC的View Layer)仍然存在不一致。在这篇文章中,我们将检查这种不一致,并且探索解决的方案。

范例不一致的再发现

让我们先看一个经典的parent-child关系例子(看下面的代码):prodUCt和category。Category类定义了一个类型为long的标示符id和一个类型为String的属性name。Product类也有一个类型为long的标示符id和一个类型为Category的属性category,表示了多对一的关系(也就是说很多product可以属于一个Category)

/**

* @hibernate.class table="CATEGORY"

*/

public class Category {

private Long id;

private String name;

/**

* @hibernate.id generator-class="native" column="CATEGORY_ID"

*/

public Long getId() {

return id;

}

public void setId(Long id) {

this.id = id;

}

/**

* @hibernate.property column="NAME"

*/

public String getName() {

return name;

}

public void setName(Long name) {

this.name = name;

}

}

/**

* @hibernate.class table="PRODUCT"

*/

public class Product {

private Long id;

private Category category;

/**

* @hibernate.id generator-class="native" column="PRODUCT_ID"

*/

public Long getId() {

return id;

}

public void setId(Long id) {

this.id = id;

}

/**

* @hibernate.many-to-one

* column="CATEGORY_ID"

* class="Category"

* cascade="none"

* not-null="false"

*/

public Category getCategory() {

return category;

}

public void setCategory(Category category) {

this.category = category;

}

}

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有 導航