您的位置:首页 > 编程语言 > Java开发

Spring Data JPA 使用

2013-06-21 14:39 543 查看

1,Spring 使用JPA

(1),实体类

@Entity
@Table(name = "ss_user")
public class User extends IdEntity {

private String loginName;
private String plainPassword;
private String password;

。。。
//getter /setter
}


(2),业务层

@Service
public class AccountService {

@Autowired
private UserDao userDao;

@Transactional
public void saveUser(User user){
userDao.save(user);
}
。。。。
}

(3),持久层实现

@Repository("userDao")
public class UserDaoImpl implements UserDao {

@PersistenceContext
private EntityManager em;

@Transactional
public Long saveUser(User user) {
em.persist(user);
return user.getId();
}
}

(4),配置文件

<!-- Jpa Entity Manager 配置 -->
<bean id="entityManagerFactory"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="jpaVendorAdapter" ref="hibernateJpaVendorAdapter" />
<property name="packagesToScan" value="com.blueinfo.jee.entity" />
<property name="jpaProperties">
<props>
<prop key="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory
</prop>
<prop key="net.sf.ehcache.configurationResourceName">cache/ehcache-hibernate-local.xml</prop>
<prop key="hibernate.ejb.naming_strategy">org.hibernate.cfg.ImprovedNamingStrategy</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop>
</props>
</property>
</bean>

<bean id="hibernateJpaVendorAdapter"
class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
<property name="database" value="POSTGRESQL" />
</bean>

<!-- 事务管理器配置, Jpa单数据源事务 -->
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>

(5),在web中使用,假设使用springmvc:

@Controller
public class LoginController {

@Autowired
private AccountService accountService;
@RequestMapping(value = "/login", method = RequestMethod.POST)
public String login( User user, Model model) {
accountService.saveUser(user);
return "login";
}
}


可以发现 Spring 对 JPA 的简化已经非常出色了,我们可以大致总结一下 Spring 框架对 JPA 提供的支持主要体现在如下几个方面:

首先,它使得 JPA 配置变得更加灵活。JPA 规范要求,配置文件必须命名为 persistence.xml,并存在于类路径下的 META-INF 目录中。该文件通常包含了初始化 JPA 引擎所需的全部信息。Spring 提供的 LocalContainerEntityManagerFactoryBean 提供了非常灵活的配置,persistence.xml 中的信息都可以在此以属性注入的方式提供。

其次,Spring 实现了部分在 EJB 容器环境下才具有的功能,比如对 @PersistenceContext、@PersistenceUnit 的容器注入支持。

第三,也是最具意义的,Spring 将 EntityManager 的创建与销毁、事务管理等代码抽取出来,并由其统一管理,开发者不需要关心这些,如前面的代码所示,业务方法中只剩下操作领域对象的代码,事务管理和 EntityManager 创建、销毁的代码都不再需要开发者关心了。

2,使用Spring data jpa
Spring Data JPA 框架,主要针对的就是 Spring 唯一没有简化到的业务逻辑代码,开发者连仅剩的实现持久层业务逻辑的工作都省了,唯一要做的,就只是声明持久层的接口,其他都交给 Spring Data JPA 来帮你完成。

使用方法:
1),添加Spring data jpa 发布包,可以从spring官网:http://www.springsource.org/spring-data/jpa    下载
2)在配置文件(上文中已配置好spring jpa)中添加配置

<!-- Spring Data Jpa配置, 扫描base-package下所有继承于Repository<T,ID>的接口 -->
<jpa:repositories base-package="com.blueinfo.jee.reposity.jpa"
transaction-manager-ref="transactionManager"
entity-manager-factory-ref="entityManagerFactory" />

3),修改持久层
public interface UserDao extends Repository<User, Long> {

public AccountInfo save(User user);

// 你需要做的,仅仅是新增如下一行方法声明
public User findByAccountId(Long userId);
}


不用写具体实现,配置了 <jpa:repositories> 后,Spring 初始化容器时将会扫描 base-package 指定的包目录及其子目录,为继承 Repository 或其子接口的接口创建代理对象,并将代理对象注册为 Spring
Bean,业务层便可以通过 Spring 自动封装的特性来直接使用该对象。其他代码同样使用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: