如何在Spring Boot中摆脱JpaRepository接口

5

当使用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;

  ...

为了能够持久化该实体,我需要为每个实体设置一个接口:
@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每一个接口。
如何将save方法直接嵌入到Account中,以便我只需调用account.save(),并且如何摆脱我必须为每个实体声明的所有@Repository接口?
2个回答

3
很可能不是你想听的答案,但我还是给你吧。在项目开始时,每个类的所有这些接口似乎都是无用的样板文件,但随着项目的扩大,有越来越多的实体需要自定义数据库交互。此外,您还可以通过继承JpaRepository类为一组实体定义查询。但是,声明一个处理存储库自动连接的基类可以改善代码中控制器部分的内容。下面是一个示例(需要Spring 4)。
public class BaseController<Model> {

    @Autowired
    protected JpaRepository<Model, Long> repository;

}

@Controller
public class AdminController extends BaseController<Admin> {

}

甚至值得花费一定的精力手动设置所有Hibernate基础代码,然后通过AspectJ将entityManager注入实体中,但这些都违背了使用SpringBoot作为快速开发工具的初衷。BaseController已经是一个进步。 - Jan Vladimir Mostert
1
一般来说,至少有两种大型模式。其中之一是仓储库模式,另一个是活动记录模式。Spring Data 遵循仓储库模式方法,因此选择 Spring Data 很可能意味着您必须使用它。另一方面,Grails GORM 则不同,因为它使用活动记录模式。这允许通过域对象(也就是您的意思)与数据库进行交互。所以这是您想要在项目中使用的技术的选择。 - mh-dev
太棒了,这就涉及到Active Record模式和Repository模式的选择。我需要阅读一些资料来确定何时选择其中一种模式而不是另一种模式。看起来Repository模式更适合复杂的业务逻辑。 - Jan Vladimir Mostert

1
如果你的实体之间有某种关系,一种选择是使用@OneToMany@OneToOne等类型注释。这不能完全替代所有存储库接口,但可能会减少所需的数量。除此之外,您可以尝试活动记录模式。Spring有Spring Roo,其中包含一些代码生成器,但我承认我不是Roo的忠实粉丝。快速搜索结果显示ActiveJPA使用活动记录样式,为您提供所需的优点,而无需Spring Roo,只是看起来好像已经有一段时间没有维护了。https://github.com/ActiveJpa/activejpa

我刚刚从Spring Roo转向Spring Boot,因为Spring Roo会生成大量的AspecJ文件,其中大部分我都不使用,然后我必须进行Push In重构来摆脱所有的AspectJ文件。但是,我喜欢它生成的类能注入EntityManager,使得entity.persist()entity.merge()等操作成为可能。这也是我在Spring Boot中想要的——享受Spring Boot的便利性,却避免了臃肿的问题。 “@OneToMany”我经常使用,感谢建议!我将保持问题开放几天,看看是否会得到其他回复。 - Jan Vladimir Mostert

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接