如何制作通用的jpa存储库?我应该这样做吗?为什么?

时间:2014-05-14 11:12:06

标签: java spring hibernate jpa

我是新的堆栈溢出和使用hibernate和mysql处理spring jpa数据。我为每个实体类创建了一个JpaRepository。但现在我觉得我应该为所有实体使用一个存储库,因为在我的所有存储库中都有常见的CRUD操作方法。

  1. save()

  2. update()

  3. 删除()

  4. findOne()

  5. 的findAll()

  6. 除了上述方法之外,我的应用程序中还有其他自定义方法。

    我的目标是实现GenericRepo,

    public interface MyGenericRepo extends JpaRepository<GenericEntity,Integer>
    {
    
    }
    

    我的实体将像:

    class Place extends GenericEntity
    {
        private Event event;
    }
    
    class Event extends GenericEntity
    {  
    
    }
    
    class Offer extends GenericEntity
    {
         private Place place;
    }
    
    class User  extends GenericEntity
    {
         private Place place;
    }
    

    我打电话的时候:

        MyGenericRepo myRepo;
    
        GenericEntity place=new Place();
    
        myRepo.save(place);
    

    它应该保存位置。

    [http://openjpa.apache.org/builds/1.0.2/apache-openjpa-1.0.2/docs/manual/jpa_overview_mapping_inher.html#jpa_overview_mapping_inher_joined][1]
    

    我已经提到了上面的链接,我发现Jpa继承与Joined和Table-Per-Class策略类似于我正在寻找的,但这些都有一定的局限性。所以请告诉我应该尝试实现这个通用如果我得到任何演示代码,那么我会非常感激......

    谢谢..

    如何制作通用jpa存储库?我应该这样做吗?为什么呢?

1 个答案:

答案 0 :(得分:4)

如果你想创建自己的Repos(而不是为你工作的弹簧数据)你的例子也不错,我在一个应用程序中使用类似的策略。

这里有一些改进通用方法的想法: 我在我的基本域中添加了ID信息,该信息由所有域对象实现:

public interface UniqueIdentifyable<T extends Number> {
    T getId();
    void setId(T id);
}

在下一步中,我创建了一个通用的CRUDRepo:

public interface CRUDRepository<ID extends Number, T extends UniqueIdentifyable<ID>>{
   ID insert(T entity);
   void delete(T entity);
   ....
} 

我正在使用CRUDRepo的抽象类:

public abstract class AbstractCRUDRepo<ID extends Number, T extends UniqueIdentifyable<ID>> implements CRUDRepo<ID, T>, {...}

域名repo api现在看起来像:

public interface UserRepo extends CRUDRepo<Integer, User > {
   User mySpecificQuery(..);
} 

最后您可以通过以下方式实施您的回购:

public class UserRepoImpl extends AbstractCRUDRepo<Integer, User > implements UserRepo {
   public User mySpecificQuery(..){..}
}