在将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
接口?
答案 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