gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:13:59 26 4
gpt4 key购买 nike

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

  1. 保存()

  2. 更新()

  3. 删除()

  4. findOne()

  5. 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 Inheritance with Joined 和 Table-Per-Class 策略与我正在寻找的类似,但这些都有一定的局限性。所以请告诉我我应该尝试实现这个通用的事情。如果我得到任何演示代码,那么我将非常感激......

谢谢..

如何制作通用的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>, {...}

域 repo api 现在看起来像:

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

最后你可以通过以下方式实现你的 repo 协议(protocol):

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

关于java - 如何制作通用的jpa存储库?我应该这样做吗?为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23653007/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com