如何摆脱Spring Boot中的JpaRepository接口

时间:2016-03-11 21:38:29

标签: java spring spring-boot spring-data spring-data-jpa

在将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个接口中定义10个@Repository接口和@autowire

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

2 个答案:

答案 0 :(得分:3)

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

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

示例如何完成(需要我认为Spring 4)

public class BaseController<Model> {

    @Autowired
    protected JpaRepository<Model, Long> repository;

}

@Controller
public class AdminController extends BaseController<Admin> {

}

答案 1 :(得分:1)

如果您的实体之间存在某种关系,则可以使用@OneToMany@OneToOne和朋友类型注释。这不会有效地替换所有存储库接口,但可能会减少您需要的数量。除此之外,您可以尝试使用活动记录模式。 Spring有Spring Roo,它有一些代码生成器,但我当然不是Roo的忠实粉丝。一个快速的谷歌搜索出现了ActiveJPA,它使用活跃的记录风格,无需Spring Roo即可为您提供所需的优势,只是看起来不像是在一段时间内维护。 https://github.com/ActiveJpa/activejpa