【发布时间】:2018-01-31 13:40:52
【问题描述】:
我发现自己很难在 Spring Data JPA 中实现可定制的方法。
例如,我有一个 Pet 类,它有一个 Owner(Many to One rel.) 如果我有一个 save(Pet pet, int ownerId) 的方法怎么办。我怎样才能得到ownerId?使用 Hibernate 我就可以 getReference 那样
public Pet save(Pet pet, int ownerId) {
if (!pet.isNew() && get(pet.getId(), ownerId) == null) {
return null;
}
pet.setUser(em.getReference(Owner.class, ownerId));
if (pet.isNew()) {
em.persist(pet);
return pet;
} else {
return em.merge(pet);
}
}
但是使用 Spring DJPA 并不是那么容易。我创建了一个扩展JpaRepository < Pet, Integer >的接口,希望父类有一个方法叫做
saveWithReference,但我没有找到任何东西.. 有什么想法吗?
【问题讨论】:
-
假设你也有一个
OwnerRepository使用getOne方法...返回一个引用。 (所有这些在JpaRepository的javadoc中也有解释。 -
那么,我应该在 PetRepository 中也有 OwnerRepository 吗?
-
你应该有一个
OwnerRepository。 -
我已经创建了它,并实现了所有的 CRUD 方法,就像在 JpaRepo 中一样。实现 PetRepository 要困难得多,因为有对 ownerID 的引用,而不是简单的 crud
-
为什么需要实现它?!您不应该实现这些接口,Spring Data 会为您创建实现。您应该有一个服务,该服务具有存储 Pet 的方法并包含委托给所需存储库的逻辑。基本上,您使用
EntityManager在此处发布的内容应该在服务中,而不是EntityManager它应该使用存储库。
标签: java spring hibernate jpa spring-data-jpa