`

Spring DATA jpa 持久化实例 2(转)

    博客分类:
  • jpa
 
阅读更多
准备工作做好后就可以进行简单的coding了:


三个表  userinfo;roleinfo;userrole
使用多对多的配置方式来实现实体对应:


UserInfo:
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;


@Entity
@Proxy(lazy = false)
//@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class UserInfo implements UserDetails {


private static final long serialVersionUID = 4081982980296385637L;
@Id
@Column(length=32)
@GeneratedValue(generator="system-uuid")
@GenericGenerator(name="system-uuid", strategy = "uuid.hex")
private String id;
private String username;
private String password;
private String mobile;
private String email; 
@Temporal(TemporalType.DATE)
private Date accountExpireDate;


@Temporal(TemporalType.DATE)
private Date credentialsExpireDate;
private byte state;
@ManyToMany(targetEntity = RoleInfo.class, fetch = FetchType.EAGER)
@JoinTable(name = "UserRole", joinColumns = @JoinColumn(name = "userId"), inverseJoinColumns = @JoinColumn(name = "roleId"))
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
private Set<RoleInfo> roles;


public UserInfo() {
super();
}


public void setAccountNonLocked(boolean isNonLocked) {
if(isNonLocked == true) this.state = 2;
}
public void setEnabled(boolean isEnabled) {
if(isEnabled == true) this.state = 1;
}
public void setRecvMsg(boolean isRecvMsg) {
if(isRecvMsg ^ isRecvMsg()) this.state = (byte) (this.state ^ (byte)0x10);
}
public boolean isRecvMsg() {
return (byte)(state & (byte)0x10) > 0;
}
public Set<RoleInfo> getRoles() {
return roles;
}
public void setRoles(Set<RoleInfo> roles) {
this.roles = roles;
}


public Collection<? extends GrantedAuthority> getAuthorities() {
List<GrantedAuthority> grantedAuthorities = new ArrayList<GrantedAuthority>(roles.size());
for(RoleInfo role : roles) { 
grantedAuthorities.add(new SimpleGrantedAuthority(role.getValue())); 

return grantedAuthorities;
}
public boolean isAccountNonLocked() {
if(state == 2)return true;
return false;
}
public boolean isEnabled() {
if(state == 1)return true;
return false;
}
}


用户实体需要实现UserDetails,并且在该实体中进行一些用户校验和权限赋值。
默认需要实现下列方法:
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
// TODO Auto-generated method stub
return null;
}
@Override
public boolean isAccountNonExpired() {
// TODO Auto-generated method stub
return false;
}
@Override
public boolean isAccountNonLocked() {
// TODO Auto-generated method stub
return false;
}
@Override
public boolean isCredentialsNonExpired() {
// TODO Auto-generated method stub
return false;
}


@Override
public boolean isEnabled() {
// TODO Auto-generated method stub
return false;
}




持久层接口:
@Component
public class UserDAO extends GenericDAO<UserInfo,String> {
}


JPA的泛型DAO基类(GenericDAO):
public class GenericDAO<T, ID extends Serializable> extends JpaDaoSupport
{
private Class<T> entityClass;


@SuppressWarnings("unchecked")
public GenericDAO() {
this.entityClass = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
}


public T findById(ID id) throws ObjectRetrievalFailureException{
Assert.notNull(id);
return (T) getJpaTemplate().find(entityClass, id);
}


@SuppressWarnings("unchecked")
public List<T> findAll() {
final String queryString = "select model from "+ entityClass.getSimpleName() +" model";
return (List<T>) getJpaTemplate().find(queryString);


}
   
public List<T> findByProperty(String propertyName, final Object value) {
final String queryString = "select model from " + entityClass.getSimpleName()
+ " model where model." + propertyName + "= ?";
System.out.println("auth step1 findByProperty:"+queryString+" username="+value);
return findByQueryString(queryString, value);
}


@SuppressWarnings("unchecked")
public List<T> findByQueryString(final String queryString, final Object... values) {
Assert.hasText(queryString);
return getJpaTemplate().executeFind(new JpaCallback() {
public Object doInJpa(EntityManager em) throws PersistenceException {
return (List<T>)createQuery(em, queryString, values).getResultList();
}
});
}
public Query createQuery(EntityManager em, String queryString, Object... values) {
Assert.hasText(queryString);
Query query = em.createQuery(queryString);
if (values != null)
for (int i = 0; i < values.length; i++)
query.setParameter(i + 1, values[i]);
return query;
}
public T save(T entity){
return getJpaTemplate().merge(entity);
}
public void remove(T entity){
getJpaTemplate().remove(entity);
}
public void remove(ID id) {
remove(findById(id));
}
// @SuppressWarnings("unchecked")
// public Page pagedQuery(final String queryString, int pageNo, final int pageSize, final Object... values) {
// return pagedQuery(queryString, pageNo, pageSize, 0, values);
// }
@SuppressWarnings("unused")
private static String removeSelect(String queryString) {
Assert.hasText(queryString);
int beginPos = queryString.toLowerCase().indexOf("from");
Assert.isTrue(beginPos != -1, " queryString : " + queryString + " must has a keyword 'from'");
return queryString.substring(beginPos);
}


@SuppressWarnings("unused")
private static String removeOrders(String queryString) {
Assert.hasText(queryString);
Pattern pattern = Pattern.compile("order\\s*by[\\w|\\W|\\s|\\S]*", Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher(queryString);
StringBuffer stringBuffer = new StringBuffer();
while (matcher.find()) {
matcher.appendReplacement(stringBuffer, "");
}
matcher.appendTail(stringBuffer);
return stringBuffer.toString();
}
}




创建 service层:
顺便提一下 spring的事务分类:
Spring在TransactionDefinition接口中规定了7种类型的事务传播行为,
Propagation 传播


事务传播行为类型    说明


PROPAGATION_REQUIRED
如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。这是最常见的选择。


PROPAGATION_SUPPORTS
支持当前事务,如果当前没有事务,就以非事务方式执行。


PROPAGATION_MANDATORY
使用当前的事务,如果当前没有事务,就抛出异常。


PROPAGATION_REQUIRES_NEW
新建事务,如果当前存在事务,把当前事务挂起。


PROPAGATION_NOT_SUPPORTED
以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。


PROPAGATION_NEVER
以非事务方式执行,如果当前存在事务,则抛出异常。


PROPAGATION_NESTED
如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED类似的操作。


@Transactional(readOnly = true)
public interface IUserService {
@Secured("ROLE_ADMIN") //对于方法的细粒度权限控制
public abstract List<User> readUsers();
@Secured("ROLE_ADMIN")
@Transactional(readOnly = false, propagation = Propagation.REQUIRES_NEW)
public abstract String saveUser(User user);
@Secured("ROLE_ADMIN")
@Transactional(readOnly = false, propagation = Propagation.REQUIRES_NEW)
public abstract void deleteUser(String id);
@Secured("ROLE_ADMIN")
public List<Middle> readUserRole(String id);
}


@Component
public class UserService implements IUserService {
private UserDAO userDAO;


private RoleDAO roleDAO;
public List<User> readUsers() {
List<User> result = new ArrayList<User>();


try {
for (UserInfo userInfo : userDAO.findAll()) {
User user = new User();
String[] ignoreProperties = { "roles" };
BeanUtils.copyProperties(userInfo, user, ignoreProperties);
result.add(user);
}
} catch (RuntimeException e) {
throw new RuntimeException(e);
}


return result;
}


public void deleteUser(String id) {
try {
this.userDAO.remove(id);
} catch (RuntimeException e) {
throw new RuntimeException(e);
}
}


public String saveUser(User user) {
try {
UserInfo userInfo = new UserInfo();
String[] ignoreProperties = { "accountExpireDate",
"credentialsExpireDate", "roles", "groups" };
BeanUtils.copyProperties(user, userInfo, ignoreProperties);
userInfo.setAccountExpireDate(user.getAccountExpireDate());
UserInfo ui = userDAO.save(userInfo);
return ui.getId();
} catch (RuntimeException e) {
throw new RuntimeException(e);
}
}
public List<Middle> readUserRole(String id) {
List<Middle> result = new ArrayList<Middle>();
UserInfo userInfo = userDAO.findById(id);
//Assert.isNull(userInfo);
Set<RoleInfo> roles = userInfo.getRoles();
for(RoleInfo roleInfo :roleDAO.findAll()) {
Middle userRole = new Middle();
BeanUtils.copyProperties(roleInfo, userRole);
userRole.setMark(roles.contains(roleInfo));
result.add(userRole);
}
return result;
}
public UserDAO getUserDAO() {
return userDAO;
}


public void setUserDAO(UserDAO userDAO) {
this.userDAO = userDAO;
}


public RoleDAO getRoleDAO() {
return roleDAO;
}


public void setRoleDAO(RoleDAO roleDAO) {
this.roleDAO = roleDAO;
}


}
分享到:
评论

相关推荐

    spring data jpa入门实例

    【Spring Data JPA 入门实例】 Spring Data JPA 是 Spring 框架的一个模块,它简化了数据库访问层(DAO)的开发,通过提供自动化的 Repository 实现,使得开发者无需编写大量的 CRUD(创建、读取、更新、删除)代码...

    SpringData JPA 参考文档PDF 英文

    Spring Data JPA 1.4.2版本的官方参考文档详细介绍了如何使用Spring Data JPA来简化数据持久化层的编码工作。 核心概念部分(Core concepts)涵盖了Spring Data JPA的基本概念,例如使用仓库(Repositories)、定义...

    spring data jpa 入门例子

    Spring Data JPA是Spring框架的一个模块,用于简化Java Persistence API(JPA)的使用,它提供了数据访问的抽象层,让开发者能够以更简洁的方式与数据库进行交互。本入门例子将帮助你理解并掌握Spring Data JPA的...

    Spring Data JPA1.7中文文档

    Spring Data JPA 是一个强大的框架,它简化了与Java Persistence API (JPA)的交互,提供了对数据库操作的便捷抽象。1.7.0.RELEASE 版本的文档由 Oliver Gierke、Thomas Darimont 和 Christoph Strobl 编写,并由 ...

    Spring+Spring MVC+SpringData JPA整合完成增删改查,翻页实例.zip

    总的来说,"Spring+Spring MVC+SpringData JPA整合完成增删改查,翻页实例"是一个全面展示Spring生态系统的示例项目,涵盖了Web应用开发的主要方面:请求处理、数据持久化和用户界面。通过这个实例,开发者可以学习...

    2017 spring data jpa+spring4.2+springmvc+hibernate4.3 maven环境intellij idea增删改查实例

    Spring Data JPA是Spring框架的一部分,它简化了持久化数据的过程,使得与数据库交互变得更加容易。通过Spring Data JPA,开发者可以使用Java Persistence API (JPA) 和ORM(对象关系映射)工具如Hibernate,无需...

    Spring Data JPA 简化 JPA 开发

    JPA 通过注解或 XML 配置来定义对象与数据库表之间的映射关系,实现了数据持久化。 Spring Data JPA 是 Spring Data 家族的一员,它的设计目标是进一步减少开发人员在数据访问层的工作量。通过 Spring Data JPA,...

    spring data jpa demo

    Spring Data JPA 是 Spring 框架的一个模块,主要目的是为了简化数据库访问,并且提供一个统一的抽象层,让开发者能够方便地使用各种持久化技术,如 Hibernate、EclipseLink 等 JPA 实现。Spring Data JPA 提供了对 ...

    分布式微服务例子:SpringBoot2.X+SpringCloud+SpringDataJPA+Consul+Feign+Swagger

    它提供了ORM(对象关系映射)的抽象层,支持包括JPA在内的多种持久化技术,简化了数据库查询和存储操作。 4. **Consul**: 是一个用于服务发现和服务网格的数据中心解决方案。在这里,它作为注册中心,让微服务能够...

    SpringDataJpa.rar

    Spring Data JPA是Spring框架的一个模块,它简化了Java Persistence API (JPA)的使用,提供了与各种数据...配合MySQL数据库,Spring Data JPA可以轻松地实现数据的持久化和管理,是现代Java应用中常用的数据访问技术。

    Spring Data JPA - 开发文档.pdf

    JPA即Java Persistence API,是Java EE中用于持久化管理的一个标准。Spring Data JPA的目标是简化数据访问层(Repository层)的代码开发,让开发者能够更专注于业务逻辑的实现。 ### 核心概念 在Spring Data JPA中...

    spring-data-jpa

    Spring Data JPA 是Spring框架的一个子项目,它提供了基于JPA规范的数据持久化解决方案,主要目的是简化数据访问层的代码。JPA(Java Persistence API)是Java EE(现在是Jakarta EE)的一部分,提供了对象关系映射...

    Spring Data JPA文档.zip

    Spring Data JPA是Java开发中的一个强大框架,它简化了持久化层的开发,通过将ORM(对象关系映射)与Spring框架相结合,为开发者提供了简单、高效的数据库操作方式。这个压缩包“Spring Data JPA文档.zip”包含了...

    SpringMVC +Hibernate JPA+Spring-data-jpa实例

    通过这个实例,你可以学习到如何将SpringMVC、Hibernate JPA和Spring Data JPA结合使用,构建一个完整的Web应用,包括数据库的访问、业务逻辑的处理以及Web接口的实现。这样的组合既提供了高效的ORM支持,又利用了...

    spring data jpa1.7 中文

    - **Bug追踪器**: 项目使用 Jira (https://jira.spring.io/browse/DATAJPA) 追踪 bug 和功能请求,用户可以在此报告问题或者查看已有的问题列表。 - **版本库**: 官方提供的稳定版本库位于 ...

    spring data jpa -reference 使用指南(2014年9月版)

    这一部分讲解了如何创建和配置Spring Data JPA存储库实例。包括了XML配置、Java Config配置以及独立使用存储库的方式。此外,还介绍了一个重要的概念——过滤器,这允许开发者根据某些条件动态地修改存储库行为。 #...

    Struts2整合Spring、JPA

    Struts2处理Web请求,Spring管理组件和事务,JPA负责数据持久化,三者协同工作,降低了代码的耦合度,提高了开发效率和应用的可维护性。在实际开发中,还需要注意版本兼容性,合理配置,以及性能优化等方面的问题。

    springboot+springdata jpa增删改查

    综上所述,这个项目涵盖了从后端数据持久化、前端动态页面生成、无刷新交互到UI设计以及缓存优化等多个方面,是一个全面的Web开发实例,对于初学者来说,既可以从中学到SpringBoot和SpringData JPA的使用,也能了解...

Global site tag (gtag.js) - Google Analytics