首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JPA持久化实体而不带持久化()指令

JPA持久化实体而不带持久化()指令
EN

Stack Overflow用户
提问于 2013-09-02 10:32:04
回答 2查看 174关注 0票数 1

我有一个JPAServiceImpl方法:

代码语言:javascript
复制
@Override
@Transactional
public void createPageContent(SellerContent content, long userId) {

    Seller s = em.find(Seller.class,userId);
    content.setSeller(s);

    content.setSeller(s);
    s.addContent(content);
}

它可以工作,但我想知道它如何工作,因为没有任何em.merge(seller)em.persist(content)

卖方有CascadeType.ALL与SellerContent的关系。

你能解释一下这是不是正常的行为吗?我会同时写em.merge(seller)em.persist(content)。这样做不对吗?

例如,我编写了以下方法:

代码语言:javascript
复制
@Override
@Transactional
public void createFeedback(CartLine cartLine, String feedbackString) {
    Product product = cartLine.getProduct();

    Feedback feedback = new Feedback();
    feedback.setFeedbackContent(feedbackString);
    feedback.setCartLine(cartLine);
    cartLine.setFeedback(feedback);
    product.getFeedbacks().add(feedback);
    feedback.setProduct(product);

    em.persist(feedback);
    em.merge(cartLine);
    em.merge(product);
}        

在这种方法中,我编写了合并和持久化指令。这样做不对吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-09-02 12:20:41

它可以工作,因为您的Seller对象是通过同一事务中的实体管理器加载的。在运行时,它将被代理对象替换。此对象上的每个更改都将在事务结束时自动保持。您可以非常容易地检查它:在运行时,在createPageContent方法中设置一个制动器,然后检查Seller s变量的实际类型。它将是以下内容所必需的代理:

  • 检测Seller s状态上的每个更改(例如,s.addContent(content))。在事务结束时保持这些更改。
  • 负载懒惰关系。假设您的SellerOwner列表。默认情况下,在运行时,此列表将为空。当您执行s.getOwners().iterator()时,它将被加载。

因此,通常只需要对使用new关键字创建的实例调用new。大多数情况下,甚至这是不必要的:您可以将新的对象A附加到持久化对象B,然后调用em.persist(B)A将通过级联方式持久保存。

代码的第二块:

  • 我认为您可以安全地删除em.merge调用。只有在执行CartLine mergedCartline = em.merge(cartLine); mergedCartline.doSomething()时才需要合并。
  • 如果:( a)始终通过实体管理器加载CartLine cartLine;( b) cartLine.feedback属性可以通过级联(取决于映射)持久化,则可以删除cartLine.feedback调用。
票数 2
EN

Stack Overflow用户

发布于 2013-11-29 20:56:04

由于您的实体处于托管状态,所以不必调用percist()方法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18571050

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档