相关疑难解决方法(0)

用更轻的解决方案替换完整的ORM(JPA/Hibernate):推荐的加载/保存模式?

我正在开发一个新的Java Web应用程序,我正在探索新的方法(对我来说是新的!)来保存数据.我主要有JPA和Hibernate的经验,但除了简单的情况,我认为这种完整的ORM会变得非常复杂.另外,我不喜欢和他们一起工作.我正在寻找一种新的解决方案,可能更接近SQL.

我正在调查的解决方案:

但与Hibernate相比,我有两个使用案例,我担心这些解决方案.我想知道这些用例的推荐模式是什么.


用例1 - 获取实体并访问其中一些相关的子孙实体.

  • 假设我有一个Person实体.
    • Person有一个相关的Address实体.
      • Address有一个相关的City实体.
        • City实体有一个name属性.

从人员实体开始,访问城市名称的完整路径是:

person.address.city.name
Run Code Online (Sandbox Code Playgroud)

现在,假设我PersonService使用以下方法从a加载Person实体:

public Person findPersonById(long id)
{
    // ...
}
Run Code Online (Sandbox Code Playgroud)

使用Hibernate,Person可以根据需要延迟加载与之关联的实体,因此可以访问person.address.city.name并确保我可以访问此属性(只要该链中的所有实体都不可为空).

但是使用我正在研究的3种解决方案中的任何一种,它都会更复杂.有了这些解决方案,有哪些推荐的模式来处理这个用例?在前面,我看到3种可能的模式:

  1. 可以通过所使用的SQL查询急切地加载所有必需的关联子孙实体.

    但是我在这个解决方案中看到的问题是,可能还有一些其他代码需要从实体访问其他实体/属性路径Person.例如,可能需要访问一些代码person.job.salary.currency.如果我想重用findPersonById()我已经拥有的方法,那么SQL查询将需要加载更多信息!不仅是相关address->city实体,还包括相关job->salary实体.

    现在如果还有10个其他地方需要从人员实体开始访问其他信息呢?我是否应该急切地加载所有可能需要的信息?或者可能有12种不同的服务方法来加载一个人实体?:

    findPersonById_simple(long id)
    
    findPersonById_withAdressCity(long id)
    
    findPersonById_withJob(long id)
    
    findPersonById_withAdressCityAndJob(long id)
    
    ...
    
    Run Code Online (Sandbox Code Playgroud)

    但是每当我使用一个Person实体时,我就必须知道装载它的是什么以及什么没有...它可能非常麻烦,对吧? …

java sql repository-pattern mybatis jooq

37
推荐指数
4
解决办法
2万
查看次数

标签 统计

java ×1

jooq ×1

mybatis ×1

repository-pattern ×1

sql ×1