论坛模块_设计及映射本模块的所有实体

论坛模块_设计本模块的所有实体

实体有几个,有什么关系,属性:主键、关联关系属性、一般属性、特殊属性(解决某个问题而设计【排序】),最后在看一遍设计的属性能满足这个页面和那个页面吗

主题数和文章数在Forum实体中新增topicCount和articleCount两个属性发帖删帖对应加1减一,把它当做普通的属性显示就没有效率性能的问题了,因为查询的操作远远多于发删帖,查询的数据很多

最后发表的主题也在Forum中设计lastTopic属性,只要发新主题了把这个属性改一下

主题的标题、内容时间、作者。发表时间、主题类型、从父类继承来了

回复数量、不用关联对象的集合去查,存一个普通的字段replyCount  int型,没发表一次回复加1

最后回复lastReply的人和时间

主题列表的顺序?新的在前面

FROM

  Topic t

ORDER BY

  if(t.lastReply == null){

    t.postTime

  }else{

    t.lastReply.postTime

  }

DESC

===========================================

在Topic中新增字段lastUpdateTime  Date类型

FROM

  Topic t

ORDER BY

  t.lastUpdateTime DESC

回复标题、回复内容时间、作者、楼层

回复楼层?

回帖的楼层是不能改变的

因为在发帖时经常会有“对某楼说”的情况,所以回帖的楼层不能改变,否则就会出现一些问题。

删除回帖的策略与楼层显示的策略

方式一:

删除策略:直接删除回复,显示时不显示已删除的回复。

楼层显示策略:需要记住楼层,可以在Reply实体中增加一个floor属性。

方式二:

删除策略:不直接删除回复,而是做一个已删除的标记,显示时还有此楼,不过把内容显示为“此帖已被管理员删除”。

楼层显示策略:在显示回复列表时实时的计算出楼层。方式为:

不分页:${status.count}楼

分页  :${(currentPage - 1) * pageSize + status.count} 楼

===========================================

映射时注意:

1,content应是text类型。

2,有一对一的关联关系。(基于主键【id引用id】、基于外键【唯一性约束】)

3,单向关联。

4,继承。

论坛模块_设计及映射实体

Article.java

/**
 * 文章
 * @author yejin
 */
public class Article {
    private Long id;
    private String title;// 标题
    private String content;// 内容
    private Date postTime;// 发表时间
    private User author;// 作者
    private String ipAddr;// 发表文章时所用的IP地址
    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    public String getTitle() {
        return title;
    }
    public void setTitle(String title) {
        this.title = title;
    }
    public String getContent() {
        return content;
    }
    public void setContent(String content) {
        this.content = content;
    }
    public Date getPostTime() {
        return postTime;
    }
    public void setPostTime(Date postTime) {
        this.postTime = postTime;
    }
    public User getAuthor() {
        return author;
    }
    public void setAuthor(User author) {
        this.author = author;
    }
    public String getIpAddr() {
        return ipAddr;
    }
    public void setIpAddr(String ipAddr) {
        this.ipAddr = ipAddr;
    }
}

Forum.java

/**
 * 版块
 * @author yejin
 */
public class Forum {
    private Long id;
    private String name;
    private String Description;
    private int position;    //排序用的位置号

    private Set<Topic> topics = new HashSet<Topic>();
    private int topicCount;    //主题数量
    private int articleCount;    //文章数量(主题+回复)
    private Topic lastTopic;    //最后发表的主题

    public Set<Topic> getTopics() {
        return topics;
    }
    public void setTopics(Set<Topic> topics) {
        this.topics = topics;
    }
    public int getTopicCount() {
        return topicCount;
    }
    public void setTopicCount(int topicCount) {
        this.topicCount = topicCount;
    }
    public int getArticleCount() {
        return articleCount;
    }
    public void setArticleCount(int articleCount) {
        this.articleCount = articleCount;
    }
    public Topic getLastTopic() {
        return lastTopic;
    }
    public void setLastTopic(Topic lastTopic) {
        this.lastTopic = lastTopic;
    }
    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getDescription() {
        return Description;
    }
    public void setDescription(String description) {
        Description = description;
    }
    public int getPosition() {
        return position;
    }
    public void setPosition(int position) {
        this.position = position;
    }
}

Reply.java

/**
 * 回复
 * @author yejin
 */
public class Reply extends Article{
    private Topic topic;// 所属的主题

    public Topic getTopic() {
        return topic;
    }

    public void setTopic(Topic topic) {
        this.topic = topic;
    }
}

Topic.java

/**
 * 主题
 * @author yejin
 */
public class Topic extends Article{
    private Forum forum;// 所属版块
    private Set<Reply> replies = new HashSet<Reply>();
    private int type;// 类型
    private int replyCount;// 回复数量
    private Reply lastReply;// 最后回复
    private Date lastUpdateTime;// 最后更新时间(主题发表时间或最后回复的时间)

    public Forum getForum() {
        return forum;
    }
    public void setForum(Forum forum) {
        this.forum = forum;
    }
    public Set<Reply> getReplies() {
        return replies;
    }
    public void setReplies(Set<Reply> replies) {
        this.replies = replies;
    }
    public int getType() {
        return type;
    }
    public void setType(int type) {
        this.type = type;
    }
    public int getReplyCount() {
        return replyCount;
    }
    public void setReplyCount(int replyCount) {
        this.replyCount = replyCount;
    }
    public Reply getLastReply() {
        return lastReply;
    }
    public void setLastReply(Reply lastReply) {
        this.lastReply = lastReply;
    }
    public Date getLastUpdateTime() {
        return lastUpdateTime;
    }
    public void setLastUpdateTime(Date lastUpdateTime) {
        this.lastUpdateTime = lastUpdateTime;
    }
}

映射实体

Forum.hbm.xml

<hibernate-mapping package="cn.itcast.oa.domain">
    <class name="Forum" table="itcast_forum">
        <id name="id">
            <generator class="native" />
        </id>
        <property name="name"></property>
        <property name="description"></property>
        <property name="position"></property>
        <property name="topicCount"></property>
        <property name="articleCount"></property>

        <!-- topics属性,本类与Topic的 一对多-->
        <set name="topics" >
            <key column="forumId"></key>
            <one-to-many class="Topic"/>
        </set>

        <!-- lastTopic属性,本类与Topic的一对一,采用基于外键的一对一映射方式,本方有外键 -->
        <many-to-one name="lastTopic" class="Topic" column="lastTopicId" unique="true"></many-to-one>

    </class>
</hibernate-mapping>

Topic.hbm.xml

<hibernate-mapping package="cn.itcast.oa.domain">
    <class name="Topic" table="itcast_topic">
        <id name="id">
            <generator class="native" />
        </id>
        <property name="title"></property>
        <property name="content" type="text" length="65536"></property>
        <property name="postTime" type="timestamp"></property>
        <property name="ipAddr"></property>    

        <property name="type"></property>
        <property name="replyCount"></property>
        <property name="lastUpdateTime" type="timestamp"></property>

        <!-- author属性,本类与User的多对一 -->
        <many-to-one name="author" class="User" column="authorId"></many-to-one>

        <!-- forum属性 ,本类与Forum的多对一-->
        <many-to-one name="forum" class="Forum" column="forumId"></many-to-one>        

        <!-- replies属性,本类与Reply一对多 -->
        <set name="replies" >
            <key column="topicId"></key>
            <one-to-many class="Reply"/>
        </set>

        <!-- lastReply属性,本类与Reply一对一
            采用基于外键的一对一映射,本方有外键
         -->
         <many-to-one name="lastReply" class="Reply" column="lastReplyId" unique="true"></many-to-one>

    </class>
</hibernate-mapping>

Reply.hbm.xml

<hibernate-mapping package="cn.itcast.oa.domain">
    <class name="Reply" table="itcast_reply">
        <id name="id">
            <generator class="native" />
        </id>
        <property name="title"></property>
        <property name="content" type="text" length="65536"></property>
        <property name="postTime" type="timestamp"></property>
        <property name="ipAddr"></property>    

        <!-- author属性,本类与User的多对一 -->
        <many-to-one name="author" class="User" column="authorId"></many-to-one>

        <!-- topic属性,本类与Topic的多对一 -->
        <many-to-one name="topic" class="Topic" column="topicId"></many-to-one>

    </class>
</hibernate-mapping>

把映射文件加到hibernate.cfg.xml

运行测试类testSessionFactory()方法,创建表,查看表结构外键是否正确

public class SpringTest {
    //得到容器对象,创建容器对象
    private ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");

    @Test
    public void testBean() throws Exception {
        TestAction testAction = (TestAction) ac.getBean("testAction");
        System.out.println(testAction);
    }
    //测试SessionFactory
    @Test
    public void testSessionFactory() throws Exception {
        SessionFactory sessionFactory = (SessionFactory)ac.getBean("sessionFactory");
        System.out.println(sessionFactory);
    }
    //测试事务
    @Test
    public void testTransaction() throws Exception {
        TestService testService = (TestService) ac.getBean("testService");
        testService.saveTwoUser();
    }
}
时间: 2024-11-07 10:26:27

论坛模块_设计及映射本模块的所有实体的相关文章

权限模块_整体方案说明_设计实体&amp;映射实体_实现初始化权限数据的功能

权限模块_整体方案说明 要点说明 权限就是控制功能的使用(功能对应着URL). 对功能的控制就是对URL的访问控制. 在我们的程序中,一个功能对应一个或两个URL: 1,例如列表或删除功能,只对应一个URL. 2,例如添加或修改功能,对应两个URL:..add, ..addUI 权限模型 权限方案: 用户 *----* 角色 *----* 权限 与权限相关的功能具体有哪些: 初始化数据:... 分配权限:... 使用权限:... 具体有哪些功能 初始化数据(安装) 权限数据. 超级管理员. 分配

数据库设计之问卷模块的设计2

数据库设计之问卷模块的设计1 2016/07/13更新 整个实习已经告一段落了,其实整个问卷模块的数据库设计,在6月初基本上已经最终敲定并实现出来了. 本次的总结分为两个部分. 一.对之前提出的几个遗留问题,解决了的做一个说明 二.最终总结一下,问卷模块的核心:问卷.试题.选项几个实体之间的关系如何表示,如实记录之中的心路历程,以及遇到过的一些坑. 一.之前遗留问题 1.结果试题标签 这个结果标签其实不是难点,到时候只需要记录获得的结果标签的id即可. 一次问卷的评价当然可以获得,若干个结果标签

系统管理模块_部门管理_设计(映射)本模块中的所有实体并总结设计实体的技巧_懒加载异常问题_树状结构

系统管理模块_部门管理_设计本模块中的所有实体并总结设计实体的技巧 设计实体流程 1,有几个实体? 一般是一组增删改查对应一个实体. 2,实体之间有什么关系? 一般是页面引用了其他的实体时,就表示与这个实体有关联关系. 3,每个实体中都有什么属性? 1,主键.推荐使用代理主键 2,关联关系属性.在类图中,关联关系是一条线,有两端,每一端对应一个表达此关联关系的属性.有几个端指向本类,本类中就有几个关联关系属性. 3,一般属性.分析所有有关的页面,找出表单中要填写的或是在显示页面中要显示的信息等.

论坛模块_版块管理_增删改查&amp;实现上下移动

论坛模块_版块管理1_增删改查 设计实体Forum.java public class Forum { private Long id; private String name; private String Description; private int position; //排序用的位置号 public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getNam

系统管理模块_岗位管理_实现CRUD功能的具体步骤并设计Role实体

系统管理模块_岗位管理_实现CRUD功能的具体步骤并设计Role实体 1,设计实体/表 设计实体 --> JavaBean --> hbm.xml --> 建表 设计Role实体 1 public class Role { 2 private Long id; 3 private String name; 4 private String description; 5 public Long getId() { 6 return id; 7 } 8 public void setId(L

Java SSH框架系列:用户登录模块的设计与实现思路

时间 2014-01-19 16:14:54  CSDN博客原文  http://blog.csdn.net/nupt123456789/article/details/18504615 1.简介 用户登录模块,指的是根据用户输入的用户名和密码,对用户的身份进行验证等.如果用户没有登录,用户就无法访问其他的一些jsp页面,甚至是action都不能访问. 二.简单设计及实现 本程序是基于Java的SSH框架进行的. 1.数据库设计 我们应该设计一个用户表,其Userinfo表,对应的SQL语句为(

WinForm应用程序之注册模块的设计与实现

Posted on 2012-11-13 10:21 星星之火116 阅读(3260) 评论(4) 编辑 收藏 我们在安装一些桌面应用程序的时候,往往在会有提示当前用户使用的是试用版,要进行注册.刚好最近做了一个关于应用程序注册的小demo(这里只是一个思路),在这里和大家分享一下. 项目的要求是这样的: 1. 能获取主机硬盘序列号.网卡MAC地址.CPU编号,并按照一定的算法由此生成机器码 2. 能根据机器码按照一定的算法生成注册码 3. 未注册时,不能使用会员管理功能 好的废话不多说,马上进

跟我一起学extjs5(33--单个模块的设计[1建立表和bean])

跟我一起学extjs5(33--单个模块的设计[1建立表和bean]) 现在开始进入这个系统的第一个核心部分,就是如何对模块的功能进行设计.请看下图,一个最简单的模块包括的内容有:模块属性,字段属性,列表定义和表单定义. 在上面的定义中,一个模块可以有n个字段组成,可以有若干个列表方案和表单方案:每一个列表和表单可以有若干个组组成,每个组下面又有若干个字段.这样的设计也符合这个教程的前20节中设计出来的功能.现在要做的就是把这些功能做成前后台交互的. 先开始模块字段和列表方案的定义.以上各个方案

系统管理模块_用户管理1_实现用户有关的功能_测试功能、解决事务的问题、对密码进行MD5摘要

系统管理模块__用户管理1__实现用户有关的功能 了解用户管理要做什么(增删改查初始化密码) 设计实体 分析功能有几个对应几个请求 增删改查有6个请求,初始化密码一个 实现增删改查一组功能的步骤流程 一.做Action相关的准备: Action.JSP.配置 二.做Service相关的准备: 接口.实现类.配置 三.填空: Action方法.Service方法.JSP页面 实现一组功能的步骤(一) 以User为例: 一.做Action相关的准备 1,创建 MyAction extends Bas