目录
Struts、Hibernate与JavaBean之间的关系
Struts2、Hibernate初学者最近使用这两个框架做了一个小型项目,使用过后也有了一些心得和看法。如有不对之处,请不吝赐教。
Struts中Action类与JavaBean
一、Action类创建和配置过程
1.编写对应的域对象(JavaBean–实体类POJO)
package com.hgl.po;
public class User {
private String username;
private String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
2.编写Action类,扩展ActionSupport类(可根据选择使用模型驱动方法传递数据,需要实现ModelDriven接口)
package com.hgl.action;
import com.hgl.po.User;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
import java.util.Map;
public class UserAction extends ActionSupport implements ModelDriven {
private User user = new User();
public Object getModel(){
return user;
}
public String execute() throws Exception{
......
}
}
3.在Struts.xml中配置文件
<action name="login" class="com.hgl.action.UserAction">
<result name="success" type="redirectAction">
<!-- 提交一个actionName 执行对应的action -->
<param name="actionName">addUser</param>
<param name="namespace">/week03</param>
</result>
</action>
二、模型驱动和属性驱动
ModelDriven(模型驱动):
Action实现ModelDrivenj接口,声明对应实体类的对象,然后进行实例化或者添加setter/getter方法,实现getModel()
方法,将实体类对象返回。
使用了模型驱动后,客户端表单提交的是基本数据类型,使用的name是和实体类的变量名一致,使用模型驱动可以让Action代码看起来更加简洁。
FieldDriven(属性驱动):
1.属性为基本数据类型:客户端提交表单的数据名对应Action类的属性名,所有变量声明和setter/getter在Action类中实现,使得代码可读性降低。
2.属性为域对象类型:类似与模型驱动,将数据封装在一个实体类中,Action类中声明实体类属性,添加setter/getter方法。客户端提交表单的数据名对应实体类中属性名:域对象.属性名
。
总结:
如果使用了ModelDriven或者FieldDriven的以域对象为对象时,每次提交一次数据到Action类时,Struts会自动生成一个对象实例,用于保存表单提交的数据。当需要进行数据库的update、delete、insert时,先检查表单提交后生成的对象实例的属性是否获取完全。update、delete时可以使用id先将数据从数据库中获取,再进行操作。
模型驱动使得代码简洁,将表单数据封装成实体类,表单数据名也只需要使用对应的实体类的属性名。
千万不要混用!!!使用模型驱动就全部使用模型驱动,不要再使用属性驱动,如果混用在获取表单数据时有时获取数据会导致获取不到,或者分不清到底是传数据到哪个属性中保存。
Hibernate中的JavaBean
一、Hibernate中Bean的三种状态
在hibernate中Bean有三种状态:分别时瞬态、持久态、托管态,都是hibernate框架对同一个Bean不同操作的结果。
当程序创建一个对象实例时,在hibernate中被称为瞬态,仅仅保存在内存当中,程序结束后就不存在了。
当进行了持久化操作后:从数据库查记录并保存到对象变量中、进行插入数据或者修改数据时,瞬态->持久态;删除记录后,对应的对象实例与数据库无关联,则从持久态变成瞬态。
关闭session或者清除session中的缓存(调用Session中close()
、clear()
、evict()
指定删除某个对象的缓存)可以从持久态变成托管态;重新进行插入和修改数据可以从托管态转换成持久态。
瞬态和托管态在没有没引用时将很快会被JVM垃圾回收机制回收,持久态不会被回收。
二、hibernate中Bean的映射配置
实体类:
package com.hgl.news.entity;
import javax.persistence.Entity;
import java.util.Date;
public class News {
private Integer id;
private String title;
private Category category;
private String content;
private String source;
private String author;
private Date postDate;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public Category getCategory() {
return category;
}
public void setCategory(Category category) {
this.category = category;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public String getSource() {
return source;
}
public void setSource(String source) {
this.source = source;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public Date getPostDate() {
return postDate;
}
public void setPostDate(Date postDate) {
this.postDate = postDate;
}
}
xml映射配置文件:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.hgl.news.entity">
<class name="News" table="news">
<id name="id">
<generator class="native"/>
</id>
<property name="title" type="string" length="60" not-null="true"/>
<property name="content" type="text" not-null="true"/>
<property name="source" type="string" length="50" not-null="true"/>
<property name="author" type="string" length="20" not-null="true"/>
<many-to-one name="category" class="Category" column="cid"/>
<property name="postDate" type="timestamp" not-null="true" update="false"/>
</class>
</hibernate-mapping>
主键:必须有个id来作为数据表的主键,使用<id>
标签映射,generator子标签可以选择increment、identity、sequence、hilo、native、assigned
属性 | 作用 |
---|---|
increment | 由Hibernate以递增的方式生成主键,当由多个实例向同张表插入时,可能会出现主键重复错误。 |
identity, | 由底层数据库的自增主键生成机制生成,要求底层数据库支持自增字段类型。 |
sequence | 由底层数据库的序列生成机制产生,要求底层数据库支持序列。 |
hilo | 由Hibernate按照高/低位算法生成 |
native | 根据底层数据库对自动生成标识符支持能力(推荐使用) |
assigned | 由应用程序产生(默认) |
以上为一些使用心得,如有错误,请不吝赐教,以帮助我在这方面有所提升,万分感谢。