Spring Data JPA 实现自动化的JPA Repository

    Spring Data JPA 可以终结样版式的愚蠢行为——仅仅因为要处理的领域类型不同,而要一遍遍写相同持久化的方法。

详细的代码,在github上

Spring Data JPA 仅限于单个JPA查询。当需要做的事情无法通过Spring Data JPA来实现,可以使用传统的方式。

当Spring Data JPA 为Repository生成实现的时候,它还会查找名字与接口相同,并且添加了Impl后缀的一个类。如果这个类存在的话,Spring Data JPA将会把它的方法与Spring Data JPA所生成的方法合并一起。

项目的结构

项目结构

一、引入jar包

    <dependency>
      <groupId>org.springframework.data</groupId>
      <artifactId>spring-data-jpa</artifactId>
      <version>2.1.6.RELEASE</version>
    </dependency>

二、使用Java方式(RootConfig.java)配置JPA ,配置Spring Data JPA

/**
 * 配置ContextLoaderListenerDataAPI的所有魔力, 扫描基础包,来查找拓展自Spring Data JPA Repository接口的所有接口,
 * 如果发现拓展自Repository的接口, 它会自动生成这个接口的实现。
 */
@Configuration
@ComponentScan(basePackages = {"com.hef.spittr"}, excludeFilters = {@ComponentScan.Filter(type = FilterType.ANNOTATION,
        value = EnableWebMvc.class)})
@EnableJpaRepositories(basePackages = "com.hef.spittr.dao", entityManagerFactoryRef = "entityManagerFactoryBean")
public class RootConfig {

注意: 配置SpringDataJPA时,如果存在名称为  “entityManagerFactory ”的 Bean,就不需要定义 excludeFilters 参数了

   /**
     * 使用容器管理类型的JPA
     *
     * @param dataSource
     * @param jpaVendorAdapter 指明使用那一个厂商的JPA实现
     * @return
     */
    @Bean
    public LocalContainerEntityManagerFactoryBean entityManagerFactoryBean(DataSource dataSource,
                                                                           JpaVendorAdapter jpaVendorAdapter){
        LocalContainerEntityManagerFactoryBean emfb =
                new LocalContainerEntityManagerFactoryBean();
        emfb.setDataSource(dataSource);
        emfb.setJpaVendorAdapter(jpaVendorAdapter);
        // 扫描, 查找带有 @Entity 注解的类
        emfb.setPackagesToScan("com.hef.spittr.domain");
        return emfb;
    }

    /**
     * 使用Hibernate厂商的Jpa实现 jpaVendorAdapter
     * @return
     */
    @Bean
    public JpaVendorAdapter jpaVendorAdapter(){
        HibernateJpaVendorAdapter adapter = new HibernateJpaVendorAdapter();
        adapter.setDatabase(Database.H2);
        adapter.setShowSql(true);
        adapter.setGenerateDdl(false);
        adapter.setDatabasePlatform("org.hibernate.dialect.H2Dialect");
        return adapter;

    }

    /**
     * @PersistenceContext 该注解是JPA规范提供的, 为了让Spring理解这些注解,并注入EntityManager,
     * 必须要配置 PersistenceAnnotationBeanPostProcessor
     * <context:annotation-config></context:annotation-config>  或 <context:component-scan></context:component-scan>
     * 注解会自动注册 PersistenceAnnotationBeanPostProcessor
     * @return
     */
    @Bean
    public PersistenceAnnotationBeanPostProcessor persistenceAnnotationBeanPostProcessor(){
        return new PersistenceAnnotationBeanPostProcessor();
    }

    /**
     * 异常转化,不是强制的,
     * 如果希望抛出特定的 JPA 或Hibernate 配置这个
     * @return
     */
    @Bean
    public BeanPostProcessor persistenceTranslation(){
        return new PersistenceExceptionTranslationPostProcessor();
    }

    @Bean
    public JpaTransactionManager transactionManager(){
        JpaTransactionManager jpaTransactionManager = new JpaTransactionManager();
        return jpaTransactionManager;
    }

三、定义业务实体的Repository(Dao)

import com.hef.spittr.domain.Spitter;
import org.springframework.data.jpa.repository.JpaRepository;

/**
 * 使用 Spring DataJPA终结 愚蠢的样版行为
 */
public interface SpitterDao extends JpaRepository<Spitter, Long> {
}

四、测试

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {RootConfig.class})
@ActiveProfiles("dev")
public class SpitterDaoTest {

    @Autowired
    private SpitterDao spitterDao;

    @Test
    public void shouldNotNull(){
        Assert.assertNotNull(spitterDao);
    }

    @Test
    public void findAllSpitter(){
        List<Spitter> spitters = spitterDao.findAll();
        for (Spitter spitter: spitters){
            System.out.println(spitter);
        }
        Assert.assertNotNull(spitters);
    }

    @Test
    public void saveSpitter(){
        Spitter spitter = new Spitter();
        spitter.setFullName("spitter");
        spitter.setUsername("username");
        spitter.setPassword("password");
        spitter.setEmail("username@gmail.com");
        spitter.setUpdateByEmail(false);
        spitterDao.save(spitter);
    }

}

五、遇到的问题

问题一:写下下面的代码,报了下面的异常

@Component
@Transactional
public class SpitterServiceimpl implements SpitterService {

    @Autowired
    private SpitterDao spitterDao;

    @Override
    public Spitter findSpitterById(Long id) {
        return spitterDao.getOne(id);
    }
}

org.hibernate.LazyInitializationException: could not initialize proxy [con.hef.spittr.domain.Spitter#1] - no Session

解决方案:在实体bean上添加  @Proxy(lazy = false) 注解

@Entity
@Table(name = "spitter")
@Proxy(lazy = false)
public class Spitter implements Serializable {

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
您好,感谢您的提问。创建一个 Spring Data JPARepository 接口非常简单,只需要按照以下步骤操作即可: 1. 创建一个继承自 `JpaRepository` 的接口,指定实体类和主键类型: ``` public interface UserRepository extends JpaRepository<User, Long> { } ``` 其中,`User` 是您的实体类,`Long` 是实体类的主键类型。`JpaRepository` 是 Spring Data JPA 提供的一个基础 Repository 接口,提供了一些基本的数据操作方法,如插入、删除、更新、查询等。 2. 在您的实体类上添加注解,指定表名和主键: ``` @Entity @Table(name = "user") public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String username; private String password; // 省略 getter 和 setter 方法 } ``` 在上述代码中,`@Entity` 注解表示该类是一个 JPA 实体类,`@Table(name = "user")` 指定该实体类对应的数据库表名为 `user`,`@Id` 和 `@GeneratedValue` 注解指定实体类的主键。 3. 在您的 Spring Boot 应用程序中,使用 `@EnableJpaRepositories` 注解启用 Spring Data JPA,并指定 Repository 接口的包路径: ``` @SpringBootApplication @EnableJpaRepositories(basePackages = "com.example.repository") public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } } ``` 在上述代码中,`@EnableJpaRepositories` 注解用于启用 Spring Data JPA,`basePackages` 属性指定 Repository 接口的包路径。 4. 在您的服务层或控制器中注入 Repository 接口,即可使用 Spring Data JPA 提供的基本数据操作方法: ``` @RestController public class UserController { @Autowired private UserRepository userRepository; @GetMapping("/users") public List<User> getAllUsers() { return userRepository.findAll(); } } ``` 在上述代码中,`@Autowired` 注解用于自动注入 `UserRepository` 对象,然后在 `getAllUsers` 方法中调用 `findAll` 方法获取所有用户信息。 通过上述步骤创建一个 Spring Data JPARepository 接口非常简单,希望能够帮助到您。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值