我有一个JPAServiceImpl方法:
@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)。这样做不对吗?
例如,我编写了以下方法:
@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);
} 在这种方法中,我编写了合并和持久化指令。这样做不对吗?
发布于 2013-09-02 12:20:41
它可以工作,因为您的Seller对象是通过同一事务中的实体管理器加载的。在运行时,它将被代理对象替换。此对象上的每个更改都将在事务结束时自动保持。您可以非常容易地检查它:在运行时,在createPageContent方法中设置一个制动器,然后检查Seller s变量的实际类型。它将是以下内容所必需的代理:
Seller s状态上的每个更改(例如,s.addContent(content))。在事务结束时保持这些更改。Seller有Owner列表。默认情况下,在运行时,此列表将为空。当您执行s.getOwners().iterator()时,它将被加载。因此,通常只需要对使用new关键字创建的实例调用new。大多数情况下,甚至这是不必要的:您可以将新的对象A附加到持久化对象B,然后调用em.persist(B)。A将通过级联方式持久保存。
代码的第二块:
em.merge调用。只有在执行CartLine mergedCartline = em.merge(cartLine); mergedCartline.doSomething()时才需要合并。CartLine cartLine;( b) cartLine.feedback属性可以通过级联(取决于映射)持久化,则可以删除cartLine.feedback调用。发布于 2013-11-29 20:56:04
由于您的实体处于托管状态,所以不必调用percist()方法。
https://stackoverflow.com/questions/18571050
复制相似问题