最近学习了Struts2,Spring,Hibernate的内容。并做了一个简单的消息发送的例子,因为系统很小,所以也不好意思叫系统。虽然例子简单,但SSH整合的基本内容都包含了。就记录下来,方便以后查阅。
这个是系统的基本需求。
用户能够发送消息(多选用户进行群发),查看自己的收件箱(其实是看自己接收到的消息),查看发件箱(查看发送消息记录)。用户进行分组,每个分组也可以包含多个子分组。例子中只把分组的实体建立了,并未实现与分组相关的功能。
1.系统开始前最关键的也是最难的就是概念模型的设计。
用户与消息之间有两个关系,一个是发送消息,另一个是接收消息。其中发送消息用户与消息之间发送消息关系是一对多,用户与消息之间的接收消息关系多对多,在进行概念模型设计是我们一般将多对对关系拆分为两个多对一。图中的概念模型就是就是将多对对关联拆分为两个多对一关联之后的结果。拆分后还可以在抽象出来的类中加入一些字段,图中的ReceiveMessage就是抽象出来的类,在这个类中又加入了一个receiveTime字段。
用户与分组之间的关系是多对一关联,由于分组是一个树形结构,每个分组有一个父节点,每个分组又有若干子节点,所以父分组与自分组之间是一对多关联。
将概念模型建立之后我们就可以在Hibernate映射表中建立相应的关联映射了。
2.根据概念模型建立各个实体类。
package com.lql.model;
import java.util.Set;
//用户
public class ContactPerson {
private int id;
private String name;
private String password;
private Group group;
private Set<Message> sendMsgs;//已发送消息
private Set<ReceiverMessage> receiveMsgs;//接收到的消息
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Set<Message> getSendMsgs() {
return sendMsgs;
}
public void setSendMsgs(Set<Message> sendMsgs) {
this.sendMsgs = sendMsgs;
}
public Set<ReceiverMessage> getReceiveMsgs() {
return receiveMsgs;
}
public void setReceiveMsgs(Set<ReceiverMessage> receiveMsgs) {
this.receiveMsgs = receiveMsgs;
}
public Group getGroup() {
return group;
}
public void setGroup(Group group) {
this.group = group;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
package com.lql.model;
import java.util.HashSet;
import java.util.Set;
public class Group {
private int id;
private String name;
private Group parent;
private Set<Group> sons;
private Set<ContactPerson> persons;
public Set<Group> getSons() {
return sons;
}
public void setSons(Set<Group> sons) {
this.sons = sons;
}
public Group getParent() {
return parent;
}
public void setParent(Group parent) {
this.parent = parent;
}
public void addPerson(ContactPerson person) {
if (persons == null) {
persons = new HashSet<ContactPerson>();
}
persons.add(person);
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Set<ContactPerson> getPersons() {
return persons;
}
public void setPersons(Set<ContactPerson> persons) {
this.persons = persons;
}
}
package com.lql.model;
import java.util.Set;
public class Message {
private int id;
private String title;
private String content;
private ContactPerson sender;
private Set<ReceiverMessage> receivers;//消息的接收者集合
public int getId() {
return id;
}
public void setId(int 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 ContactPerson getSender() {
return sender;
}
public void setSender(ContactPerson sender) {
this.sender = sender;
}
public Set<ReceiverMessage> getReceivers() {
return receivers;
}
public void setReceivers(Set<ReceiverMessage> receivers) {
this.receivers = receivers;
}
}
package com.lql.model;
import java.util.Date;
public class ReceiverMessage {
private int id;
private ContactPerson receiver;
private Message msg;
private Date receiveTime;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public ContactPerson getReceiver() {
return receiver;
}
public void setReceiver(ContactPerson receiver) {
this.receiver = receiver;
}
public Message getMsg() {
return msg;
}
public void setMsg(Message msg) {
this.msg = msg;
}
public Date getReceiveTime() {
return receiveTime;
}
public void setReceiveTime(Date receiveTime) {
this.receiveTime = receiveTime;
}
}
上述实体类是根据概念模型建立的。接下来就是Hibernate关联映射表的建立。
3.关联映射文件的建立。
<?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">
<!--ContactPerson 映射文件 -->
<hibernate-mapping
package="com.lql.model">
<class name="ContactPerson" table="tb_person" lazy="true">
<comment>Users may bid for or sell auction items.</comment>
<id name="id">
<generator class="native"/>
</id>
<property name="name" unique="true" not-null="true"/>
<property name="password"></property>
<!-- 用户与所属分组是多对一 -->
<many-to-one name="group" column="groupId"></many-to-one>
<!-- lazy="extra"是懒加载方式,inverse="true"表示在一的一段维护关联关系 -->
<set name="sendMsgs" lazy="extra" inverse="true">
<key column="senderId"></key>
<one-to-many class="com.lql.model.Message"/>
</set>