加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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

发布时间:2020-12-15 02:54:26 所属栏目:Java 来源:网络整理
导读:这个问题很简单,你可能只是阅读代码 这是一个非常简单的性能问题.在下面的代码示例中,我希望在我的Cat对象上设置所有者.我有ownerId,但是cat方法需要一个Owner对象,而不是Long.例如:setOwner(所有者所有者) @Autowired OwnerRepository ownerRepository;@Au
这个问题很简单,你可能只是阅读代码

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

@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对象,所以我可以调用Cat上的setter,它只是取出id,并用owner_id保存Cat记录.所以基本上我只是在装载一个所有者.

这是什么样的正确模式?

解决方法

首先,您应该注意加载所有者实体的方法.

如果您正在使用Hibernate会话:

// 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 = ownerRepository.load(Owner.class,id);
owner.addCat(myCat);

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读