我发现自己很难在Spring Data JPA中实现可自定义的方法。
例如,我有一个Pet类,它有一个所有者(多对一的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
,但我没有找到任何东西......任何想法的人?
答案 0 :(得分:9)
您应该同时PetRepository
和OwnerRepository
都延伸JpaRepository
。
public interface PetRepository extends JpaRepository<Pet, Long> {}
和
public interface OwnerRepository extends JpaRepository<Owner, Long> {}
使用Spring Data JPA,您可以使用getOne
方法获取引用,这与实际查询数据库的findOne
形成对比。
使用EntityManager
编写的代码基本相同,您应该将其放在服务方法中,而不是直接使用EntityManager
使用2个存储库。
@Service
@Transactional
public PetService {
private final PetRepository pets;
private final OwnerRepository owners;
public PetService(PetRepository pets, OwnerRepository owners) {
this.pets=pets;
this.owners=owners;
}
public Pet savePet(Pet pet, long ownerId) {
if (!pet.isNew() && get(pet.getId(), ownerId) == null) {
return null;
}
pet.setUser(owners.getOne(ownerId));
return pets.save(pet);
}
}
这样的事情应该可以解决问题。无需在您的存储库中实现方法。