我是堆栈溢出和使用hibernate和mysql处理spring jpa数据的新手。我为每个实体类创建了一个JpaRepository。但是现在我觉得我应该对所有实体使用一个存储库,因为在我的所有存储库中都有通用的CRUD操作方法。
save()
update()
delete()
findOne()
findAll()
除了上述方法之外,我的应用程序中还具有其他自定义方法。
我的目标是像这样实现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]
我已经参考了上面的链接,发现使用Joined和Table-Per- Class策略的Jpa继承与我正在寻找的策略相似,但是它们都有一定的局限性,所以请告诉我是否应该尝试实现这种通用方法。我得到了任何演示代码,那么我将非常感激……
谢谢..
如何制作通用的JPA存储库?我应该这样做吗?为什么?
如果您想创建自己的Repos(而不是创建对您有用的spring数据),您的示例还不错,我在一个应用程序中使用了类似的策略。
以下是改进通用方法的一些想法:我在基本域中添加了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>, {...}
域存储库api现在看起来像:
public interface UserRepo extends CRUDRepo<Integer, User > { User mySpecificQuery(..); }
最后,您可以通过以下方式实现您的存储库:
public class UserRepoImpl extends AbstractCRUDRepo<Integer, User > implements UserRepo { public User mySpecificQuery(..){..} }