我是新的堆栈溢出和使用hibernate和mysql处理spring jpa数据。我为每个实体类创建了一个JpaRepository。但现在我觉得我应该为所有实体使用一个存储库,因为在我的所有存储库中都有常见的CRUD操作方法。
save()
update()
删除()
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]
我已经提到了上面的链接,我发现Jpa继承与Joined和Table-Per-Class策略类似于我正在寻找的,但这些都有一定的局限性。所以请告诉我应该尝试实现这个通用如果我得到任何演示代码,那么我会非常感激......
谢谢..
如何制作通用jpa存储库?我应该这样做吗?为什么呢?
答案 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(..){..}
}