Struts、Hibernate与Bean之间的关系

Struts、Hibernate与JavaBean之间的关系

Struts2、Hibernate初学者最近使用这两个框架做了一个小型项目,使用过后也有了一些心得和看法。如有不对之处,请不吝赐教。

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中对象状态图

二、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由应用程序产生(默认)

以上为一些使用心得,如有错误,请不吝赐教,以帮助我在这方面有所提升,万分感谢。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值