возвращает ли запрос управляемые или отсоединенные объекты в транзакциях JTA?

В следующем классе оба метода возвращают одни и те же объекты.

Но управляется ли список объектов, возвращаемых из первого, поскольку он является частью транзакции по сравнению со вторым, который не является частью транзакции?

public class QueryServiceImpl implements QueryService { 
    @PersistenceContext(unitName="PC") 
    EntityManager em; 

   //default attribute
   @TransactionAttribute(TransactionAttributeType.REQUIRED) 
    public List findAlItems() { 
        return em.createQuery("SELECT item FROM Item item",  
                              Item.class) 
                 .getResultList(); 
    } 


    @TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED) 
    public List findAlItemsNoTransaction() { 
        return em.createQuery("SELECT item FROM Item item",  
                              Item.class) 
                 .getResultList(); 
    } 

person brain storm    schedule 03.12.2014    source источник


Ответы (1)


Что касается вашего примера, вы правы. Не следует управлять всеми сущностями после возврата из второго метода (findAlItemsNoTransaction). Однако, если вы хотите, чтобы они управлялись, вы должны использовать:

@PersistenceContext(type=EXTENDED) 

как это было показано в спецификации JPA:

/*
* An extended transaction context is used. The entities remain
* managed in the persistence context across multiple transactions.
*/

@Stateful
@Transaction(REQUIRES_NEW)
public class ShoppingCartImpl implements ShoppingCart {
    @PersistenceContext(type=EXTENDED)
    EntityManager em;
    private Order order;
    private Product product;
    public void initOrder(Long id) {
        order = em.find(Order.class, id);
    }

    public void initProduct(String name) {
        product = (Product) em.createQuery("select p from Product p 
                where p.name = :name")
                .setParameter("name", name)
                .getSingleResult();
    }
    public LineItem createLineItem(int quantity) {
        LineItem li = new LineItem(order, product, quantity);
        order.getLineItems().add(li);
        em.persist(li);
        return li;
    }
}
person iku    schedule 03.12.2014