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

时间:2017-08-23 05:58:53

标签: java spring hibernate jpa spring-data-jpa

我发现自己很难在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,但我没有找到任何东西......任何想法的人?

1 个答案:

答案 0 :(得分:9)

您应该同时PetRepositoryOwnerRepository都延伸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);
    }
}

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