关于model层建VO的注意事项

一、PO:persistant object 持久对象,可以看成是与数据库中的表相映射的java对象。使用Hibernate来生成PO是不错的选择。   
二、VO:value object值对象。通常用于业务层之间的数据传递,和PO一样也是仅仅包含数据而已。但应是抽象出的业务对象,可以和表对应,也可以不,这根据业务的需要.
有一种观点就是:PO只能用在数据层,VO用在商业逻辑层和表示层。各层操作属于该层自己的数据对象,这样就可以降低各层之间的耦合,便于以后系统的维护和扩展。
那么下面我们就来看看在运用VO的时候要注意的几点,我这个例子和三个表相关
1 activityVO
public class ActivityVO {

    private int id; // int 标示id
    private String theme; // Varchar 活动主题
    private String userId; // Varchar 发起者id
    private int workgroupId; // int 所属工作坊id
    private int participantNumber; // int 参与人数
    private String type;// Varchar 活动类型
    private int state;// int 活动状态
    private String startTime;// StringTime 活动开始时间
    private String endTime; // StringTime 活动结束时间
    private String content;// text 活动内容
    private String specialId;// Varchar 学科
    private String activityForm;// Varvhar 活动形式
    private String tags;// Varchar 活动关键字
    private String realName;    //活动发起人昵称
    private String specialName; //学科(专业)名称
    
    public ActivityVO(){
        super();
    }
    
    public ActivityVO(int id, String theme, String userId, int workgroupId,
            int participantNumber, String type, int state, String startTime,
            String endTime, String content, String specialId,
            String activityForm, String tags, String realName,
            String specialName) {
        super();
        this.id = id;
        this.theme = theme;
        this.userId = userId;
        this.workgroupId = workgroupId;
        this.participantNumber = participantNumber;
        this.type = type;
        this.state = state;
        this.startTime = startTime;
        this.endTime = endTime;
        this.content = content;
        this.specialId = specialId;
        this.activityForm = activityForm;
        this.tags = tags;
        this.realName = realName;
        this.specialName = specialName;
    }
}

2 Activity

public class Activity implements Serializable {
    private static final long serialVersionUID = 1L;
    private int id; // int 标示id
    private String theme; // Varchar 活动主题
    private String userId; // Varchar 发起者id
    private int workgroupId; // int 所属工作坊id
    private int participantNumber; // int 参与人数
    private String type;// Varchar 活动类型
    private int state;// int 活动状态 0:未开始 1:进行中 2:已结束3:已关闭
    private String startTime;// DateTime 活动开始时间
    private String endTime; // DateTime 活动结束时间
    private String content;// text 活动内容
    private String specialId;// Varchar 学科
    private String activityForm;// Varvhar 活动形式
    private String tags;// Varchar 活动关键字
}

3 UserInfo

public class UserInfo {
    private String id;     //主键
    private String realName;    //姓名
    private String loginName;    //用户名(唯一)
    private String password;    //密码
    private String email;    //电子邮件
    private String qq;    //QQ号码
    private String mobilePhone;     //移动电话
    private int workUnitId;    //工作单位(存id)
    private int trainingProjectId;    //培训项目id
    private int trainingBatchId;    //培训批次id
    private String educationLevelId;    //培养类别id(UUID)—原层次
    private String specialId;    //学科Id(UUID)—原专业
}

 4 Special


public class Special implements Serializable{
    
    private static final long serialVersionUID = 1L;
    
    private String id;                    //标识ID
    
    private String specialNum;            //专业代码
    
    private String specialName;           //专业名称
    
    private String specialNum_jw;         //就读专业代码(上报教委)
    
    private String specialName_jw;        //就读专业名称(上报教委)
    
    private String educationLevel;        //学历层次
}

接着是运用VO的sql语句

public List<ActivityVO> getActivitysByWorkgroupIdByPage(int workgroupId, int pageNo,
            int pageSize) {
        String sql = "select new cn.edu.ccnu.model.ActivityVO(activity.id, activity.theme, activity.userId, "
                + " activity.workgroupId, activity.participantNumber, activity.type, activity.state, activity.startTime,"
                + " activity.endTime, activity.content, activity.specialId, activity.activityForm, activity.tags,"
                + " userinfo.realName ,special.specialName) "
                + "from Activity activity,UserInfo userinfo ,Special special "
                + "where activity.workgroupId=:workgroupId "
                + "and userinfo.id=activity.userId "
                + "and activity.specialId=special.id "
                + "order by activity.startTime DESC";

        List<ActivityVO> list = new ArrayList<ActivityVO>();
        try {
            Query query = getEntityManager().createQuery(sql);
            query.setParameter("workgroupId", workgroupId);
            query.setFirstResult((pageNo - 1) * pageSize);
            query.setMaxResults(pageSize);
            list = (List<ActivityVO>) query.getResultList();
        } catch (RuntimeException e) {
            e.printStackTrace();
            throw e;
        } finally {
            getEntityManager().close();
        }
        return list;

    }

好了,代码全部在上面了,下面说一下注意点:

1,在使用VO对象作为查询的结果时,sql语句一定要把类的包名也写在里面{new cn.edu.ccnu.model.ActivityVO},

2  紧接着要按照该VO的构造方法一个个把元素按顺序写上去,要注意类一定要一致,不然就会报错

3  在数据库表的设计的时候,int一定要赋予默认值,不然还是会报错(最好所有的都设默认值)

 
原文地址:https://www.cnblogs.com/keitho00/p/4318413.html