spring data jpa 自定义接口实现

来源:互联网 发布:计算面积的软件 编辑:程序博客网 时间:2024/05/16 04:54

原文来自:http://blog.csdn.net/yingxiake/article/details/51017699

没错,spring data jpa很优秀,但有一些东西,我们就想自己来,我除了想用你的,还想用我自己的

首先,我要spring data jpa的接口,为什么,因为很方便啊

public interface TaskDao extends JpaRepository<Task,Long>{}
  • 1
  • 2
  • 3

然后我想自己定义一些接口,咋办呢,那我就再定义个接口bean吧,然后再定义一些接口方法

public interface TaskDaoCustom<T,ID>{    void method();}
  • 1
  • 2
  • 3
  • 4
  • 5

那这里,我想要spring data jpa的,也想要我自己的,那我就继承吧

public interface TaskDao extends JpaRepository<Task,Long>,TaskDaoCustom<Task,Long>{}
  • 1
  • 2
  • 3

这时候,你在service应该就可以用method()方法了,但是这时候,method是空的,我们得自己来实现它,那实现吧

public class TaskDaoImpl implements TaskDaoCustom{    @Override    public void method() {        // TODO Auto-generated method stub        System.out.println("who are you !!");    }}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

有心的朋友应该有注意到,为什么我实现TaskDaoCustom的bean不应该是TaskDaoCustomImpl吗?如果你这样子做的话,编译器就报错了

 No property method found for type Task!
  • 1

那为什么呢,因为任何继承了Repository(JpaRepository最终也是继承于Repository)spring都会为他生成一个实现类,因为TaskDao 继承于TaskDaoCustom,而TaskDaoCustom中的method不是spring data jpa规范查询方法的规则,如果就报找不到找不到属性了。

或许你会问,TaskDaoCustom不会有TaskDaoCustomImpl的实现类吗,按照spring文档说的,只要配置好实现的后缀名,就会用他来实现方法么,是的,我们是这样子配置后缀的,确实也有Impl。

    <jpa:repositories base-package="com.liuxg.**.dao"        repository-impl-postfix="Impl"         query-lookup-strategy = "create-if-not-found"        entity-manager-factory-ref="entityManagerFactory"        transaction-manager-ref="transactionManager" >    </jpa:repositories>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

这里要纠正一下,这里的实现spring data jpa规定命名方法是继承于spring data jpa Repository的那个命名 + Impl,例如我们是TaskDao继承于JpaRepository,如果实现类应该是TaskDaoImpl,而不是TaskDaoCustomImpl。

spring data jpa 秉承约定大于实现,只要按照规定和约定来,就能省很多麻烦事。

到这里,你应该就能自己自定义接口了,但这个对于模块是起到了作用,如果我在搭建项目,我想直接,定义 一个BaseDao,然后自定义一些常用的公共方法,然后再利用spring data jpa的优点,只要子模块,继承于BaseDao,就能同时拥有自定义的公用方法和spring data jpa的优点,该怎么做??下一篇再看看??


原创粉丝点击