当前位置: 首页 > 面试题库 >

在Spring Data JPA中处理实体继承的最佳方法

仉刚洁
2023-03-14
问题内容

我有三个JPA实体类ABC具有以下层次结构:

    A
    |
+---+---+
|       |
C       B

那是:

@Entity
@Inheritance
public abstract class A { /* ... */ }

@Entity
public class B extends A { /* ... */ }

@Entity
public class C extends A { /* ... */ }

使用Spring Data JPA,为此类实体编写存储库类的最佳方法是什么?

我知道我可以写这些:

public interface ARespository extends CrudRepository<A, Long> { }

public interface BRespository extends CrudRepository<B, Long> { }

public interface CRespository extends CrudRepository<C, Long> { }

但是,如果在类中A有一个字段name,我在ARepository

public A findByName(String name);

我还要在其他两个存储库中编写这种方法,这有点烦人。是否有更好的方法来处理这种情况?

我想知道的另一点是ARespository应该是只读存储库(即扩展Repository类),而其他两个存储库应公开所有CRUD操作。

让我知道可能的解决方案。


问题答案:

这个想法是创建一个通用的存储库类,如下所示:

@NoRepositoryBean
public interface ABaseRepository<T extends A> 
extends CrudRepository<T, Long> {
  // All methods in this repository will be available in the ARepository,
  // in the BRepository and in the CRepository.
  // ...
}

然后我可以用这种方式编写三个存储库:

@Transactional
public interface ARepository extends ABaseRepository<A> { /* ... */ }

@Transactional
public interface BRepository extends ABaseRepository<B> { /* ... */ }

@Transactional
public interface CRepository extends ABaseRepository<C> { /* ... */ }

此外,要获得一个只读存储库,ARepository我可以将其定义ABaseRepository为只读:

@NoRepositoryBean
public interface ABaseRepository<T> 
extends Repository<T, Long> {
  T findOne(Long id);
  Iterable<T> findAll();
  Iterable<T> findAll(Sort sort);
  Page<T> findAll(Pageable pageable);
}

并且BRepository还扩展了Spring Data JPA CrudRepository来实现读/写存储库:

@Transactional
public interface BRepository 
extends ABaseRepository<B>, CrudRepository<B, Long> 
{ /* ... */ }


 类似资料:
  • 我知道我可以写这些: 但是,如果在类中有一个字段,并且我在: 我也必须在其他两个存储库中编写这样的方法,这有点烦人…有没有更好的方法来处理这种情况? 我想指出的另一点是,应该是一个只读存储库(即扩展类),而另外两个存储库应该公开所有CRUD操作。 让我知道可能的解决办法。

  • 本文向大家介绍推荐JavaScript实现继承的最佳方式,包括了推荐JavaScript实现继承的最佳方式的使用技巧和注意事项,需要的朋友参考一下    实现JavaScript继承的最简单的方式是call方法(或者apply方法)及原型链方法,但这两种方法都有缺陷,而其混合体就是很好的继承实现方式。下面举例说明:     对于类Animal来说,它有一个字段属性age及函数属性sayAge,sa

  • 我一直在读关于在处理子类时如何最好地重写equals方法的文章,在这里我发现了不少帖子。他们建议使用instanceof或getClass()实现解决方案的不同方法来比较不同子类的对象。 然而,关于有效的Java,我的理解是(我对这一点还不熟悉,所以我很可能是错的!)布洛赫认为,最终两者都会有问题,“除非你愿意放弃面向对象抽象的好处,否则没有办法在保留equals契约的同时扩展一个可实例化类并添加

  • 问题内容: 我必须在php中解析大型XML文件,其中之一是6.5 MB,它们甚至可能更大。如我所读,SimpleXML扩展将整个文件加载到一个对象中,这可能不是很有效。以您的经验,最好的方法是什么? 问题答案: 对于大文件,您将要使用SAX解析器而不是DOM解析器。 使用DOM解析器,它将读取整个文件并将其加载到内存中的对象树中。使用SAX解析器,它将顺序读取文件并调用用户定义的回调函数来处理数据

  • 不幸的是,Quarkus关于用Panache使用MongoDB的指南没有提到什么被认为是处理实体的一对多关系的最佳实践。注意:我想为依赖的子文档建模,但作为一个独立的实体。MongoDB站点演示了这种模式:用文档引用建模一对多关系,这样您就必须在存储库中查找链接到父ID的所有实体。 Quarkus(Panache)目前是否提供了任何使查找更方便的方法? PS:似乎从2020年5月开始有一个开放的增

  • 问题内容: 我正在尝试编写一个小型节点应用程序,该应用程序将搜索并解析文件系统上的大量文件。为了加快搜索速度,我们尝试使用某种类型的map reduce。该计划将是以下简化方案: Web请求带有搜索查询 启动3个进程,每个进程分配1000个(不同)文件 进程完成后,它将“返回”结果回到主线程 一旦所有进程完成,主线程将通过返回组合结果作为JSON结果来继续 我对此有以下疑问: 这在Node中可行吗