一尘不染

JPA:如何避免简单地加载对象,以便将其ID存储在数据库中?

spring-boot

这个问题很简单,您可能只需阅读代码即可

这是一个非常简单的性能问题。在下面的代码示例中,我希望OwnerCat对象上设置on
。我有ownerId,但cats方法需要一个Owner对象,而不是Long。例如:setOwner(Owner owner)

@Autowired OwnerRepository ownerRepository;
@Autowired CatRepository catRepository;

Long ownerId = 21;
Cat cat = new Cat("Jake");
cat.setOwner(ownerRepository.findById(ownerId)); // What a waste of time
catRepository.save(cat)

我正在使用ownerId加载Owner对象,因此可以在上调用setter,Cat只需将拔出id,然后使用即可保存Cat记录owner_id。因此,本质上来说,我一无所获。

正确的模式是什么?


阅读 218

收藏
2020-05-30

共1个答案

一尘不染

首先,您应注意加载Owner实体的方法。

如果您使用的是Hibernate Session

// will return the persistent instance and never returns an uninitialized instance
session.get(Owner.class, id);

// might return a proxied instance that is initialized on-demand
session.load(Owner.class, id);

如果您使用的是EntityManager

// will return the persistent instance and never returns an uninitialized instance
em.find(Owner.class, id);

// might return a proxied instance that is initialized on-demand
em.getReference(Owner.class, id);

因此,您应该延迟加载Owner实体,以避免对高速缓存或数据库造成某些损失。

顺便说一句,我建议您反转Owner和之间的关系Cat

例如 :

Owner owner = ownerRepository.load(Owner.class, id);
owner.addCat(myCat);
2020-05-30