`
zhongzhihua
  • 浏览: 313828 次
  • 来自: ...
社区版块
存档分类
最新评论

SpringSide提供的数据持久层的功能(转载)

阅读更多

在这里,将创建一个简化的用户管理模块,演示怎样利用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;
 }

分享到:
评论

相关推荐

    SpringSide4 参考手册

    最后,文档提供了一些通用工具的介绍,比如Apache Commons、Google Guava、Spring以及SpringSide自身提供的工具类,还包括了数据序列化的功能,如XML与JSON的互相转换。 整体来看,SpringSide4参考手册是一份非常...

    springside框架

    SpringSide框架在整合上述技术的基础上,提供了完善的权限管理功能。这通常涉及到用户认证(Authentication)、授权(Authorization)以及角色(Role)和权限(Permission)的管理。通过集成Spring Security或Apache...

    springside5

    【标题】"springside5" 是一个基于SpringSide框架的项目更新,它涉及了数据库、持久层技术、权限管理以及用户体验方面的改进。这个项目旨在提供一个现代化的、高效的开发环境,通过集成不同的技术和组件来优化开发...

    springside

    在深入理解SpringSide之前,我们首先需要了解Spring Framework,这是一个广泛使用的Java企业级应用开发框架,它为开发者提供了诸如依赖注入、面向切面编程、数据访问、事务管理等核心功能。 SpringSide项目的核心...

    springside-3.2.2源码

    2. Spring Data:简化数据访问,通过 JPA 或 Hibernate 提供 ORM 支持,Repository 接口提供通用的 CRUD 操作。 3. Spring Security:负责权限控制,配置 SecurityFilterChain 来拦截请求,实现用户认证和授权。 三...

    springside开发全面讲解

    6. **数据访问层**:通过集成Hibernate或MyBatis,springside简化了数据库操作,提供了ORM(对象关系映射)功能,使得开发者可以更专注于业务逻辑。 7. **安全控制**:springside内置了Spring Security模块,用于...

    Springside-core-4.1.0/Springside-core-4.1.0

    3. **数据访问层**:支持多种ORM框架,如Hibernate和MyBatis,提供统一的DAO接口,降低了数据访问层的复杂性。 4. **RESTful API**:通过Spring MVC实现RESTful服务,方便前后端分离的开发模式。 四、使用场景与...

    Springside4 学习整理

    - Persistence:包括 DynamicSpecifications、Hibernate 和 SearchFilter,这些工具类支持动态查询和数据持久化操作。 - Security:尤其是 Shiro 相关的 utils,提供了 Cryptos 和 Digests 工具类,支持消息签名、...

    springside3.3完整版

    这包括依赖注入(DI)、AOP(面向切面编程)、MVC(模型-视图-控制器)架构模式以及Spring的数据访问层支持,如JdbcTemplate和HibernateTemplate。 5. **SSH整合** "ssh3.3"这个文件名暗示了SpringSide 3.3可能...

    springside的jar包

    6. **安全控制**:Springside提供了基于Spring Security的安全控制模块,可以快速实现用户认证与授权功能,增强了应用的安全性。 7. **日志管理**:集成了Logback作为日志系统,提供了灵活的日志级别控制和输出格式...

    springside3.0.zip

    9. **日志管理**:SpringSide 3.0 使用Log4j或Logback作为日志框架,提供了灵活的日志配置和丰富的日志记录功能。 10. **持续集成**:SpringSide 3.0 考虑到持续集成的重要性,推荐使用Hudson或Jenkins进行持续构建...

    springside4(showcase)

    其次,Spring MVC提供了数据绑定、验证和转换功能。通过@ModelAttribute注解,可以将请求参数自动绑定到方法参数上。使用@Valid和Validator接口,可以实现数据校验。转换服务允许自定义类型转换,如将字符串转换为...

    springside3.3.4 使用方法

    Springside 3.3.4版本作为一个成熟的发布版,不仅集成了Spring框架的核心功能,还提供了对其他开源技术如Hibernate和Struts等的支持。在本文档中,我们将详细介绍如何使用Springside 3.3.4版本,并特别关注SSH...

    有springside4.2.3-GA.jar 包

    2. **Demo**:示例模块,提供了各种应用场景的实例,帮助开发者快速理解和使用SpringSide的各项功能,包括数据库操作、RESTful API开发、Maven构建等。 3. **Module**:模块化设计,SpringSide提供了多个可复用的子...

    springside.jar

    从项目构建、测试到功能实现,springside.jar都为Java开发者提供了高效、规范的解决方案。在实际开发中,合理利用springside.jar,不仅能提升开发效率,还能保证代码质量和项目稳定性。因此,理解和掌握springside....

    springside3

    它封装了Spring框架的一些常用功能,如数据访问、事务管理、安全控制等,并提供了方便的工具类和配置模版。此外,它还包含了一些实用的模块,如日志管理、国际化支持、性能监控等,这些都极大地简化了开发者的工作。...

    springside的一个应用实例

    模型层通常包含业务逻辑和数据处理,SpringSide使用Java Bean作为数据模型,通过Hibernate或MyBatis等持久层框架与数据库交互。控制器层负责接收请求、调用模型并返回响应,SpringSide通过注解驱动的Spring MVC使得...

    springside全攻略

    通过Spring Data JPA或MyBatis等持久层框架,开发者可以方便地操作数据库,实现CRUD操作。同时,SpringSide还提供了事务管理,确保数据的一致性。 六、Web开发 SpringSide中的Web开发部分主要基于Spring MVC,这是...

    springside4-4.2.3.GA

    它使用Hibernate作为持久层框架,与数据库交互,提供了一套完整的ORM解决方案。对于前端,它采用了Bootstrap和jQuery,提供了现代且响应式的用户界面。 总结来说,SpringSide 4.2.3.GA是一个综合性的Java开发框架,...

    SpringSide的Hibernate封装

    2. Finder函数:提供了多种查询方法,如find()、get()以及各种自定义查询功能,便于根据HQL(Hibernate Query Language)进行数据检索。 3. JDK5的可变参数支持:允许灵活地传递查询参数,支持不同数量的参数组合。 ...

Global site tag (gtag.js) - Google Analytics