一、设计用户相关实体类
积分等级类:
@Entity
public class UserGrade implements Serializable{
private static final long serialVersionUID = 552495765344987180L;
private long gradeid;
/**积分**/
private long score=BaseConfig.getInitScore(); //初始化积分为100
/**等级**/
private int grade;
private User user ;
/**荣誉称号*/
private String honour ;
private int solvecount=0;
@OneToOne(cascade={CascadeType.REFRESH}) @JoinColumn(name="userid")
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
@Column
public int getSolvecount() {
return solvecount;
}
public void setSolvecount(int solvecount) {
this.solvecount = solvecount;
}
@Id @GeneratedValue
public long getGradeid() {
return gradeid;
}
public void setGradeid(long gradeid) {
this.gradeid = gradeid;
}
public long getScore() {
return score;
}
public void setScore(long score) {
this.score = score;
}
@Column(length=5)
public int getGrade() {
return grade;
}
public void setGrade(int grade) {
this.grade = IntegralGrade.getInstance().getGrade(this.getScore());
}
@Transient
public String getHonour() {
return honour;
}
public void setHonour(String honour) {
this.honour = IntegralGrade.getInstance().getHonour(this.getGrade());
}
}
知识提示:@GeneratedValue表示由jpa自动选择标识字段生成策略; @OneToOne(cascade={CascadeType.REFRESH}) @JoinColumn(name="userid") 与User类一对一关系,级联刷新,维护字段是userid;@Transient不与数据库表字段进行映射.
二、接口类设计
说明:Service具体实现类交给了Spring容器管理,通过注解方式或XML配置文件的方式将其注入到相应的接口,这样就实现了接口与实现分离的效果,便于系统日后的维护与升级。本系统采用JPA注解方式实注入功能
BaseDaoImpl类的实现代码:
@Transactional
public abstract class BaseDaoImpl<T> implements BaseDao<T> {
private Class<T> entityClass = GenericsUtils.getSuperClassGenricType(this.getClass());
//注入一个实体管理器,spring会从EntityManagerFactory里得到一个
//EntityManager对象
@PersistenceContext(unitName="mydaxia")
protected EntityManager em;
public void delete(Serializable... ids) {
for(Serializable id :ids){
em.remove(em.getReference(this.entityClass, id));
}
}
@Transactional(propagation=Propagation.NOT_SUPPORTED)
public T find(Serializable entityId) {
return em.find(this.entityClass, entityId);
}
@Transactional(propagation=Propagation.NOT_SUPPORTED)
public T getReference(Serializable entityId){
return em.getReference(this.entityClass, entityId);
}
public void save(T entity) {
em.persist(entity);
}
public void update(T entity) {
//游离状态下更新
em.merge(entity);
}
@Transactional(propagation=Propagation.NOT_SUPPORTED)
public List<T> getDatas() {
String entityName = getEntityName(this.entityClass);
return em.createQuery("from "+entityName).getResultList();
}
/**
* 获取实体类简单名称
* @param <E>
* @param entityClass
* @return
*/
private static <E> String getEntityName(Class<E> entityClass) {
String entityName = entityClass.getSimpleName();//类的简单类名
return entityName;
}
}
知识提示: 对于只用于读取数据的业务方法,一般不要开启事务,因为开启事务会对执行效率产生影响(需要时间).GenericsUtils.getSuperClassGenricType(this.getClass()),GenericsUtils是一个工具类,此方法是获取当前类的类实例,即Class实例.
三、测试CURD方法
public class CURDTest {
private static ApplicationContext act = null;
private static UserService userService = null;
private static UserRoleService userRoleService=null;
@BeforeClass
public static void setUpBeforeClass() throws Exception {
act = new ClassPathXmlApplicationContext("beans.xml");
userService = (UserService)act.getBean("userServiceBean");
userRoleService=(UserRoleService)act.getBean("userRoleServiceBean");
}
@Test
public void saveUser(){
User user = new User();
user.setUsername("test");
user.setPassword("123456");
user.setEmail("andyeveny@126.com");
user.setUserrole(userRoleService.find("user"));
userService.save(user);
}
@Test
public void saveUserRoles(){
UserRole userRole=new UserRole();
userRole.setName("普通用户");
userRole.setSn("user");
userRoleService.save(userRole);
}
}