Spring数据JPA中getReference方法的替代方法

Ale*_*son 7 java spring hibernate jpa spring-data-jpa

我发现自己很难在Spring Data JPA中实现可自定义的方法.例如,我有一个宠物类,它有一个Owner(多对一相对.)如果我有一个方法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);
        }
    }
Run Code Online (Sandbox Code Playgroud)

但使用Spring DJPA并不是那么容易.我已经创建了一个扩展的接口JpaRepository < Pet, Integer >,希望父类有一个名为的方法 saveWithReference,但我没有找到任何东西..任何想法的人?

M. *_*num 13

你应该同时扩展PetRepositoryOwnerRepository扩展JpaRepository.

public interface PetRepository extends JpaRepository<Pet, Long> {}
Run Code Online (Sandbox Code Playgroud)

public interface OwnerRepository extends JpaRepository<Owner, Long> {}
Run Code Online (Sandbox Code Playgroud)

使用Spring Data JPA,您可以使用该getOne方法获取引用,这与findOne实际查询数据库的方法形成对比.

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

@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);
    }
}
Run Code Online (Sandbox Code Playgroud)

这样的事情应该可以解决问题.无需在您的存储库中实现方法.