春季数据JPA中获取参考方法的替代方法

2022-09-03 05:29:03

我发现自己很难在Spring Data JPA中实现可定制的方法。例如,我有一个Pet类,它有一个所有者(多对一的rel)。如果我有一种方法来.我怎样才能得到?使用Hibernate,我就可以喜欢save(Pet pet, int ownerId)ownerIdgetReference

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);
        }
    }

但是使用春季DJPA并不容易。我创建了一个扩展的接口,希望父类有一个名为,但我没有找到任何东西。伙计们,有什么想法吗?JpaRepository < Pet, Integer >saveWithReference


答案 1

您应该同时具有扩展和两个扩展。PetRepositoryOwnerRepositoryJpaRepository

public interface PetRepository extends JpaRepository<Pet, Long> {}

public interface OwnerRepository extends JpaRepository<Owner, Long> {}

使用Spring Data JPA,您可以使用getOne方法来获取引用,这与实际查询数据库的方法相反。findOne

您使用 编写的代码基本上是相同的,您应该将其放在服务方法中,而不是直接使用使用 2 个存储库。EntityManagerEntityManager

@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);
    }
}

像这样的东西应该可以解决问题。无需在存储库中实现方法。


答案 2

推荐