【问题标题】:Alternatives to getReference method in Spring data JPASpring数据JPA中getReference方法的替代方法
【发布时间】: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


【解决方案1】:

您应该同时拥有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);
    }
}

类似的东西应该可以解决问题。无需在您的存储库中实现方法。

【讨论】:

  • 非常感谢,你拯救了我的一天:D
  • 我试过了,效果很好。它替代了spring数据中的休眠加载方法
猜你喜欢
  • 2019-04-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-30
  • 2011-10-03
  • 1970-01-01
  • 2012-09-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多