当前位置: 首页 > 知识库问答 >
问题:

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

翟宏放
2023-03-14
    A
    |
+---+---+
|       |
C       B
@Entity
@Inheritance
public abstract class A { /* ... */ }

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

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

我知道我可以写这些:

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

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

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

但是,如果在类中有一个字段name,并且我在arepository:

public A findByName(String name);

我也必须在其他两个存储库中编写这样的方法,这有点烦人…有没有更好的方法来处理这种情况?

我想指出的另一点是,arespository应该是一个只读存储库(即扩展repository类),而另外两个存储库应该公开所有CRUD操作。

让我知道可能的解决办法。

共有1个答案

李辉
2023-03-14

我使用了Netgloo博客中的这篇文章中描述的解决方案。

其思想是创建一个泛型存储库类,如下所示:

@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> { /* ... */ }
@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);
}
@Transactional
public interface BRepository 
extends ABaseRepository<B>, CrudRepository<B, Long> 
{ /* ... */ }
 类似资料:
  • 问题内容: 我有三个JPA实体类,并具有以下层次结构: 那是: 使用Spring Data JPA,为此类实体编写存储库类的最佳方法是什么? 我知道我可以写这些: 但是,如果在类中有一个字段,我在: 我还要在其他两个存储库中编写这种方法,这有点烦人。是否有更好的方法来处理这种情况? 我想知道的另一点是应该是只读存储库(即扩展类),而其他两个存储库应公开所有CRUD操作。 让我知道可能的解决方案。

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

  • 这是链接中问题的继续:我正在学习java中的异常处理(基本上是在继承中),子类方法必须抛出异常,该异常是父类方法的子类。 “当子类重写超类中的方法时,子类方法定义只能在父类方法(或重写方法)的throws子句中指定异常类的所有或子集” 这是一条规则。但我不知道制定这条规则的原因是什么,为什么不允许反之亦然。为什么要创建此规则

  • 在片段着色器中采样全屏纹理的最佳方法是什么,例如延迟渲染器中的g缓冲区,或后处理着色器中的场景纹理? 目前,我使用以下两种方法: > 这似乎并不理想,因为需要分割,并且为着色器提供屏幕大小很麻烦。 将gl_FragCoord.xy转换为ivec代码,并使用texelFetch代码: 也不理想,因为需要从到的转换。 有更好的方法吗?我真的只想在我的像素着色器绘制的精确点采样一个缓冲区。 //编辑:

  • 本文向大家介绍Javascript中类式继承和原型式继承的实现方法和区别之处,包括了Javascript中类式继承和原型式继承的实现方法和区别之处的使用技巧和注意事项,需要的朋友参考一下 在所有面向对象的编程中,继承是一个重要的话题。一般说来,在设计类的时候,我们希望能减少重复性的代码,并且尽量弱化对象间的耦合(让一个类继承另一个类可能会导致二者产生强耦合)。关于“解耦”是程序设计中另一个重要的话

  • 我在JPA实体映射方面有问题。我有一些课: A级 类别b Classc *如何解决这个问题?*我还能使用类继承吗?还是另一个解决这个的方法? 谢了。