And*_*rea 44 java spring spring-data spring-data-jpa spring-boot
我有三个JPA实体类A,B并C具有以下层次结构:
A
|
+---+---+
| |
C B
Run Code Online (Sandbox Code Playgroud)
那是:
@Entity
@Inheritance
public abstract class A { /* ... */ }
@Entity
public class B extends A { /* ... */ }
@Entity
public class C extends A { /* ... */ }
Run Code Online (Sandbox Code Playgroud)
使用Spring Data JPA,为这些实体编写存储库类的最佳方法是什么?
我知道我可以写这些:
public interface ARespository extends CrudRepository<A, Long> { }
public interface BRespository extends CrudRepository<B, Long> { }
public interface CRespository extends CrudRepository<C, Long> { }
Run Code Online (Sandbox Code Playgroud)
但如果在课堂上A有一个字段name,我在下面添加了这个方法ARepository:
public A findByName(String name);
Run Code Online (Sandbox Code Playgroud)
我也要在其他两个存储库中编写这样的方法,这有点烦人.有没有更好的方法来处理这种情况?
我想要的另一点是,ARespository应该是只读存储库(即扩展Repository类),而其他两个存储库应该公开所有CRUD操作.
让我知道可能的解决方案.
And*_*rea 55
我使用了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.
// ...
}
Run Code Online (Sandbox Code Playgroud)
然后我可以用这种方式编写三个存储库:
@Transactional
public interface ARepository extends ABaseRepository<A> { /* ... */ }
@Transactional
public interface BRepository extends ABaseRepository<B> { /* ... */ }
@Transactional
public interface CRepository extends ABaseRepository<C> { /* ... */ }
Run Code Online (Sandbox Code Playgroud)
此外,要获取只读存储库,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);
}
Run Code Online (Sandbox Code Playgroud)
并且BRepository还从Spring Data JPA扩展CrudRepository到实现读/写存储库:
@Transactional
public interface BRepository
extends ABaseRepository<B>, CrudRepository<B, Long>
{ /* ... */ }
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
28422 次 |
| 最近记录: |