在这里,将创建一个简化的用户管理模块,演示怎样利用SpringSide提供的数据持久层的功能,包括怎样通过Hibernate的Annotation来配置多对一映射和多对多映射。
大 家都知道,现在最流行用户管理模型的是RBAC,也就是基于角色的访问控制模型,在这种模型中,可以划分多个层次,如用户-角色-资源、用户-角色-权限 -资源、用户-角色-角色组-权限-资源、用户-角色-角色组-权限-操作-资源等等,因此,想要创建一个完善而复杂的用户管理模块,是相当具有难度的。 在Web2.0时代,有一个很重要的开发思想,那就是先让程序跑起来,以后再逐步添加复杂的功能。因此,在这里只创建一个简化的用户管理模块。
所谓简化,它具有如下几个特点:
1.在认证方式中,选择基于用户名和密码的认证,用户需要提供用户名、密码和昵称,用户名和昵称都要求不能重复,用户名不能包含中文,且不能够被修改,昵称可以为中文,也可以被修改。密码使用MD5加密。
2.不包含用户的真实信息,如姓名、年龄、性别、职业、地址、邮编等等,因为如果包含这些字段,那么还需要包含更多的额外字段来让用户决定是否公开这些信息,因此,去掉这些东西,可以简化开发过程,让网站能够尽快的跑起来。
3.联系方式只需要用户提供它的电子邮箱和QQ号码。
4.如果用户密码丢失,可以通过密码提示问题找回,随机产生的新密码会发到用户的电子邮箱。
5.省略用户的个性化设置,如个性化签名、自定义头像等。
6.要能够记录用户的注册时间和最后登录时间。
7.要具有完善的积分和排名机制。
8.用户删除的时候不做物理删除,只标记为该用户不可用。
8. 具有简化的角色和权限管理机制,这里的简化主要有以下几点:每个用户只能属于一个角色,即多对一关系,而不是传统的多对多关系;角色不需要分组;没有专门 的资源抽象层;在角色表中只使用一个字段来表示该角色具有的权限,权限以数字表示,以逗号分开,如“1,2”,“1,3,15”等等。
9.用户可以创建群和加入群,为了简化,群的创始人即为管理员,并不可改变,用户加入群需要管理员批准,一个用户可以加如多个群,即多对多关系。
从 上面的描述可以看出,一个简化的用户管理系统最少需要三个表,即users,roles和groups表,其中users和roles之间为多对一映射, users和groups之间为多对多映射,为了实现多对多映射,并且用户加入群的时候需要管理员批准,需要一个中间表users_groups。下面是 在MySQL中创建数据表的语句。
创建用户表:
create table users(
id int not null auto_increment primary key ,
name varchar ( 20 ) not null ,
password char ( 32 ) not null ,
monicker varchar ( 30 ) not null ,
question varchar ( 30 ) not null ,
answer varchar ( 30 ) not null ,
email varchar ( 40 ) not null ,
qq varchar ( 12 ) not null ,
roleid int not null ,
score int not null default ' 0 ' ,
regtime timestamp not null default CURRENT_TIMESTAMP ,
logintime timestamp not null default ' 2007-01-01 00:00:00 ' ,
isdeleted varchar ( 2 ) not null default ' 0 ' ,
index (username),
index (monicker));
为了加快查找用户的速度,在用户名和昵称列上创建了索引。
创建角色表:
create table roles(
id int not null auto_increment primary key ,
name varchar ( 20 ) not null ,
privilegesFlag varchar ( 255 ),
index (rolename)
);
创建群组表:
create table groups(
id int not null auto_increment primary key ,
name varchar ( 40 ) not null ,
creatorid int not null ,
createtime timestamp not null default CURRENT_TIMESTAMP ,
isdeleted varchar ( 2 ) not null default ' 0 ' ,
index (groupname));
creatorid代表组的创始人,同时也是管理员,这里同样设置群组不做物理删除。
创建用户群组多对多映射辅助表:
create table users_groups(
id int not null auto_increment primary key ,
userid int not null ,
groupid int not null ,
jointime timestamp ,
status tinyint ,
index (userid),
index (groupid)
);
其中status列代表用户是否通过了管理员的批准,为了加快查找速度,在userid和groupid列上建立索引。
设计完数据库,就该设计领域对象了,领域对象的设计方法为先设计简单的POJO,然后再在POJO上添加Hibernate Annotation来配置映射关系。在进行Annotation配置的时候,可以从以下几个方面进行思考。
1、使用什么样的数据类型映射数据库中的列类型?
2、对象之间是一对一、一对多还是多对多关系?
3、关联的对象之间哪一个作为主控方?
4、对象之间的关联是单向的还是双向的?
首 先来看看users和roles之间的关系,考虑到加载一个用户数据的时候,往往同时需要知道他属于哪个角色,而加载一个角色的时候,就没有必要知道它管 理哪些用户了,因此,它们是简单的单向关系,是多对一映射。当出现多对一映射的时候,永远都应该选择多的这一方作为主控方,道理很简单,打个比方,让一个 国家元首记住全国人民的名字基本是不可能的,而让全国人民记住国家元首的名字就很简单了。因此,这里User作为主控方,Role作为被控方。
再 来看看数据类型的映射,对于简单的int、varchar这样的就不用多说了。而日期时间类型的映射是一个重点,可以看到,前面的数据库创建语句中,所有 需要时间的地方都使用了timestamp列类型,使用timestamp列类型的唯一目的就是为了能够使用default CURRENT_TIMESTAMP语句,使用date和datetime类型就不行,在MySQL中,timestamp只能表示从'1970-01- 01 00:00:00'到2037年的范围。
MySQL中的timestamp和java.sql.Timestamp表现不一 致,在MySQL中,timestamp和datetime类型精度是一样的,都只能储存到整数秒,而timestamp比datetime能表示的时间 范围要小得多,在Java中,java.util.Date和MySQL的timestamp的精度是一致的,只能储存到整数秒,而 java.sql.Timestamp还保存毫微秒,因此建议使用java.util.Date来映射timestamp列,使用 java.sql.Timestamp只是浪费。
MySQL和Java在时间上面还有一个冲突,那就是MySQL支持全零的时间, 如'0000-00-00 00:00:00',而Java不支持,因此如果在定义users表的logintime列时使用logintime timestamp not null default '0000-00-00 00:00:00',那么在使用Hibernate来获取User对象的时候就会出错,所以在创建数据库的时候要选择一个合法的默认时间,如'2007- 01-01 00:00:00'。
下面请看User.java的代码:
package com.xkland.domain;
import java.io.Serializable;
import java.util.Date;
import org.springside.core.dao.extend.Undeletable;
import org.hibernate.annotations.Cache;
import org.hibernate.annotations.CacheConcurrencyStrategy;
import javax.persistence. * ;
@Entity
@Table(name = " users " )
@Undeletable(status = " isDeleted " )
public class User implements Serializable {
private Integer id;
private String name;
private String password;
private String monicker;
private String question;
private String answer;
private String email;
private String qq;
private Role role;
private Integer score;
private Date regTime;
private Date loginTime;
private Byte isDeleted;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
public Integer getId() {
return id;
}
public void setId(Integer id) {
this .id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this .name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this .password = password;
}
public String getMonicker() {
return monicker;
}
public void setMonicker(String monicker) {
this .monicker = monicker;
}
public String getQuestion() {
return question;
}
public void setQuestion(String question) {
this .question = question;
}
public String getAnswer() {
return answer;
}
public void setAnswer(String answer) {
this .answer = answer;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this .email = email;
}
public String getQq() {
return qq;
}
public void setQq(String qq) {
this .qq = qq;
}
@ManyToOne
@JoinColumn(name = " roleid " )
public Role getRole() {
return role;
}
相关推荐
#### 二、SpringSide的数据持久层设计 数据持久层是任何企业级应用的核心组成部分之一。本节重点介绍如何使用SpringSide来搭建数据持久层,并特别关注于如何通过Hibernate Annotation进行实体类与数据库表之间的映射...
本文档详细介绍了如何使用Springside框架进行简化用户管理模块的设计与开发,重点讲解了数据持久层的搭建方法,包括数据库表结构的设计、多对多关系的处理等。此外,还提到了RBAC模型的应用,以及如何实现简单的用户...
pom.xml配置 ...mvn install:install-file -DgroupId=org.springside -DartifactId=springside-core -Dversion=4.2.2.GA -Dfile=./springside-core-4.2.2.GA.jar -Dpackaging=jar -DgeneratePom=true
2. **代码生成器**:内置的代码生成器能够自动生成常见的DAO、Service、Controller层代码,极大地提高了开发效率,减少了重复工作。 3. **配置管理**:通过提供统一的配置管理,Springside使得配置文件的组织和管理...
《SpringSide:全面解析与应用》 SpringSide项目是一个基于Java的开源软件开发框架,它以Spring Framework为核心,旨在提供一套简洁、规范的项目构建和开发实践。在深入理解SpringSide之前,我们首先需要了解Spring...
我找了很久,都是那种hubgit上的那种,一直没明白怎么用,终于后来会了,不明白为什么不直接提供jar包,还要自己生成。这个是已生成成功的。仅支持Oracle, H2, MySql, PostgreSql, SQLServer。包括core和utils,以及...
3. **数据访问层**:支持多种ORM框架,如Hibernate和MyBatis,提供统一的DAO接口,降低了数据访问层的复杂性。 4. **RESTful API**:通过Spring MVC实现RESTful服务,方便前后端分离的开发模式。 四、使用场景与...
SpringSide3-core-3.3.4是SpringSide项目的一个重要版本,它是一个基于Java的轻量级开发框架,旨在简化Spring的使用,提高开发效率。这个压缩包包含了两个关键文件:springside3-core-3.3.4.jar和springside3-...
6. **数据访问层**:通过集成Hibernate或MyBatis,springside简化了数据库操作,提供了ORM(对象关系映射)功能,使得开发者可以更专注于业务逻辑。 7. **安全控制**:springside内置了Spring Security模块,用于...
springside-core-4.2.3-GA.jar,如果jar包不完整,可能会导致异常:LifecycleProcessor not initialized - call 'refresh' before invoking lifecycle methods via the context
【标题】"maven+springside 开发入门"涉及的主要知识点是 Maven 和 Springside 这两个关键的Java开发工具。Maven 是一个项目管理和综合工具,它可以帮助开发者构建、管理和部署Java项目,而Springside则是一个基于...
3. **最佳实践**:SpringSide集成了一系列经过实战检验的最佳实践,避免了在项目中踩坑。 4. **持续集成**:预配置的Maven构建脚本和持续集成服务器支持,简化了持续集成流程。 5. **社区支持**:SpringSide拥有...
springside-core-4.3.0.jar 最新版springside-core的jar包
SpringSide是一款基于Spring框架的开源项目,它旨在为Java开发者提供一个快速、整洁且高效的开发环境。SpringSide Core 4.2.2.GA是该项目的核心库,包含了丰富的功能和最佳实践,是Spring和Spring MVC初学者的理想...
springside-core-4.2.2.GA.pom springside-core-4.2.2.GA.pomspringside-core-4.2.2.GA.pomspringside-core-4.2.2.GA.pomspringside-core-4.2.2.GA.pom
SpringSide将Spring的核心功能如依赖注入、AOP(面向切面编程)、事务管理、数据访问等进行了封装和优化,使得开发者可以更加专注于业务逻辑,而非底层实现细节。 在“springside-4.0.0.GA”压缩包中,我们可以期待...
springside4官方最新版 SpringSide是以Spring Framework为核心的,Pragmatic风格的JavaEE应用参考示例,是JavaEE世界中的主流技术选型,最佳实践的总结与演示。
### 使用SpringSide开发Web项目知识点详解 #### SpringSide简介 SpringSide是一个以Spring Framework为核心,遵循Pragmatic风格的Java EE应用参考示例。它集成了当前Java EE世界的主流技术选型与最佳实践,旨在帮助...
SpringSide 是一个基于 Spring Framework 的 Java 开发工具集,旨在简化 Spring 应用程序的开发过程,提供一套快速、现代且规范的开发实践。SpringSide 3.2.2 版本是一个成熟的版本,它在之前的版本基础上进行了优化...
二、springside-parent:父项目配置 springside-parent作为项目的父POM,包含了项目构建的基础配置,如Maven插件、依赖管理等。它统一了项目的编码规范和构建流程,使得团队成员能更高效地协同开发。 三、...