如何在 Spring Boot 中摆脱 JpaRepository 接口

How to get rid of JpaRepository interfaces in Spring Boot

在 Spring Boot 中使用 JPA 时,如何避免每个实体都有 class 和接口?

我有以下实体(和其他 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;

  ...

为了能够保留这个实体,我需要为每个实体设置一个接口:

@Repository
public interface AccountRepository extends JpaRepository<Account, Long> {
}

然后@autowire它:

@Controller
public class AdminController {

  @Autowired
  AccountRepository accountRepo;

  Account account = new Account();
  account.setUsername(...);
  ...
  accountRepo.save(account);

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

我如何将保存方法直接嵌入到 Account 中以便我只需要调用 account.save() 以及如何摆脱所有那些我必须声明的 @repository 接口每个实体?

如果您的实体有某种关系,一个选项是使用 @OneToMany@OneToOne 和朋友类型注释。这不会有效地替换所有存储库接口,但可能会减少您需要的数量。除此之外,您可以尝试活动记录模式。 Spring 有 Spring Roo 有一些代码生成器,但我承认我不是 Roo 的忠实粉丝。快速 Google 搜索找到了 ActiveJPA,它使用活动记录样式,无需 Spring Roo 即可为您提供所需的好处,只是看起来已经有一段时间没有维护了. https://github.com/ActiveJpa/activejpa

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

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

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

public class BaseController<Model> {

    @Autowired
    protected JpaRepository<Model, Long> repository;

}

@Controller
public class AdminController extends BaseController<Admin> {

}