您的位置:首页 > 编程语言 > Java开发

关于如何实现在整合struts2和hibernate4框架下对many-to-one级联数据的存储

2017-05-12 21:59 609 查看
在大多数的SSH框架教程上关于级联数据的存储往往是在Java Application下实现的。诸如User和Skill为many-to-one级联关系,User为many,Skill为one。

代码如下:

public static void main(String args[]){
User user = new User("张三","20",1);
Skill skill = new Skill();
skill.setSkcontent("读书与写作");
skill.setUser(user);
Session session = HibernateSessionFactory.getSession(); //获取Session对象
Transaction trans = session.beginTransaction(); //开始一个事务
try{
session.save(skill); //持久化操作
}catch(Exception ex){
ex.printStackTrace();
trans.rollback(); //操作不成功,事务回滚
}
trans.commit(); //提交事务
HibernateSessionFactory.closeSession(); //关闭Session
}

在Skill类中定义User对象,并通过setUser()方法设置其值,再使用session操作即可实现级联存储。

此外,还需在User.hbm.xml和Skill.hbm.xml中进行相应映射。其中Skill.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 package="com.application.skill.action">
<class name="Skill" table="SKILL">
<!-- 主键由关联实体产生 -->
<id name="id" column="ID">
<generator class="uuid.hex"/>
</id>
<!-- 内容 -->
<property name="skcontent" column="SKCONTENT" type="string" not-null="true"/>

<!-- 单向关联N-1 -->
<many-to-one name="user" column="USER_ID" class="com.application.login.action.User"/>
</class>
</hibernate-mapping>

但是现在的问题是在Web工程中,如何使用struts2实现上述存储呢?
首先必然要分别建立User和Skill的action,但如何将User的对象传输到Skill.action中进行setUser的操作呢?

笔者提出的方案为利用action的Servlet api进行session属性的存储,并在Skill.action中取出。

User.action

public class User extends ActionSupport implements Serializable,ServletRequestAware{
private String id; //用户ID
private String userName; //用户名
private String userPass; //密码
private Integer role; //用户权限
UserService userService = new UserService(); //用户业务类

private HttpServletRequest request; //声明request对象
private HttpServletResponse response; //声明response对象

public User(){
super();
}

public User(String userName, String userPass, Integer role){
super();
this.userName = userName;
this.userPass = userPass;
this.role = role;
}

public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getUserPass() {
return userPass;
}
public void setUserPass(String userPass) {
this.userPass = userPass;
}
public Integer getRole(){
return role;
}
public void setRole(Integer role){
this.role = role;
}
public boolean getCheckbox(){
return checkbox;
}
public void setCheckbox(boolean checkbox){
this.checkbox = checkbox;
}
public HttpServletRequest getServletRequest(){
return request;
}
public void setServletRequest(HttpServletRequest request){
this.request = request;
}
public HttpServletResponse getServletResponse(){
return response;
}
public void setServletResponse(HttpServletResponse response){
this.response = response;
}

/**
* @Description 登录验证
* @return 和struts.xml的result联系的字符串
*/
public String execute(){
//加载数据库验证信息
List<User> list = userService.login(userName, userPass);
for(User u: list){
//验证成功
if(u.getUserName().equals(userName) && u.getUserPass().equals(MD5.getMD5(userPass))){
//取得ID值
String ID = u.getId();
//根据ID值获取对象
User user = this.getUser(ID);
//获取Session对象
HttpSession hSession = request.getSession();
//将user对象存入session属性
hSession.setAttribute("user", user);
if(u.getRole() == 2){
return "manager";
}
return "success";
}
}
return "error";
}

/**
* @Description 按ID值取得对应的User对象
* @param ID ID值
* @return 取得的User对象
*/
private User getUser(String ID){
Session session = HibernateSessionFactory.getSession(); //获取Session
Transaction trans = session.beginTransaction(); //开始事务
User user = (User) session.get(User.class, ID); //根据主键获取用户对象
trans.commit(); //提交事务
HibernateSessionFactory.closeSession(); //关闭Session
return user;
}
}


Skill.action
public class Skill extends ActionSupport implements Serializable,ServletRequestAware{
private String id; //用户ID
private String skcontent; //内容 //文本域
private SkillService skillService = new SkillService(); //技能证书业务类

private User user; //用户类

private HttpServletRequest request; //声明request对象

public Skill() {
super();
}
public Skill(String skcontent, User user) {
super();
this.skcontent = skcontent;
this.user = user;
}

public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getSkcontent() {
return skcontent;
}
public void setSkcontent(String skcontent) {
this.skcontent = skcontent;
}
public User getUser(){
return user;
}
public void setUser(User user){
this.user = user;
}
public HttpServletRequest getServletRequest(){
return request;
}
public void setServletRequest(HttpServletRequest request){
this.request = request;
}

/**
* @Description 增加技能证书
* @return 与result相关的字符串
*/
public String add(){
//获取session属性对象
HttpSession hSession = request.getSession();
//获取user对象
User user = (User) hSession.getAttribute("user");
if(skillService.add(skcontent,user)){
return "success";
}else{
return "error";
}
}
}

下面是Skill的存储操作:
SkillDaoImpl.java

public boolean add(final String skcontent, final User user){
List<Skill> list = this.check(user);
for(Skill s: list){
if(!("".equals(s.getSkcontent()) || s.getSkcontent() == null)){ //若在数据库中已有该用户信息,则更新
if(this.update(skcontent, s)){ //更新成功
return true;
}else{ //更新失败
return false;
}
}
}

//若不存在,则创建
Skill skill = new Skill(skcontent,user); //创建要存储的对象

Session session = HibernateSessionFactory.getSession(); //获取Session对象
Transaction trans = session.beginTransaction(); //开始一个事务
try{
session.save(skill); //持久化操作
}catch(Exception ex){
ex.printStackTrace();
trans.rollback(); //操作不成功,事务回滚
return false;
}
trans.commit(); //提交事务
HibernateSessionFactory.closeSession(); //关闭Session

return true; //添加成功,返回true
}

以上系笔者个人粗浅见解,欢迎指正批评。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: