如何摆脱Spring Boot中的JpaRepository接口

Jan*_*ert 5 java spring spring-data spring-data-jpa spring-boot

在将JPA与Spring Boot一起使用时,如何避免每个实体都有一个类和一个接口?

我有以下实体(和其他10个):

@Entity
@Table(name = "account")
public class Account {

  @Id
  @GeneratedValue
  private Long id;

  @Column(name = "username", nullable = false, unique = true)
  private String username;

  @Column(name = "password", nullable = false)
  private String password;

  ...
Run Code Online (Sandbox Code Playgroud)

为了能够持久化这个实体,我需要为每个实体设置一个接口:

@Repository
public interface AccountRepository extends JpaRepository<Account, Long> {
}
Run Code Online (Sandbox Code Playgroud)

然后@autowire呢:

@Controller
public class AdminController {

  @Autowired
  AccountRepository accountRepo;

  Account account = new Account();
  account.setUsername(...);
  ...
  accountRepo.save(account);
Run Code Online (Sandbox Code Playgroud)

如果我现在有10个实体,这意味着我需要定义10个@Repository接口和10个接口中的@autowire每一个.

我如何直接嵌入该save方法,Account以便我只需要调用account.save(),如何摆脱@repository我必须为每个实体声明的所有接口?

mh-*_*dev 3

很可能不是您喜欢的答案,但无论如何我都会给您。在启动项目时,每个类的所有这些接口似乎都是无用的和样板的,但是当项目变大时,这种情况会随着时间的推移而改变。每个实体有越来越多的自定义数据库交互。此外,您还可以通过子类化 JpaRepository 类来定义一组实体的查询。

但是可以通过声明处理存储库自动装配的基类来改进代码的控制器部分。

示例如何做到这一点(我认为需要 Spring 4)

public class BaseController<Model> {

    @Autowired
    protected JpaRepository<Model, Long> repository;

}

@Controller
public class AdminController extends BaseController<Admin> {

}
Run Code Online (Sandbox Code Playgroud)