У меня есть slsb в ejb3.0 с несколькими методами, мне нужно аннотировать каждый метод с атрибутами транзакции? - PullRequest
1 голос
/ 20 октября 2010

класс декаларации:

@Stateless
@Local( { IMyLocalSLSB.class })
@Remote( { IMyRemoteSLSB.class }) })
public class mySLSB implements IMySLSB {

private EntityManager em;

и теперь некоторые методы для вставки / обновления и удаления записей БД - это обязательные аннотации транзакций, я думал, что они не как jboss, и EJB3.0 обрабатывает их, используя значения по умолчанию:

public void crud(MyEntity myEntity)  {
    em.merge(myEntity);// inserts or updates    
}

public void deleteInsert(MyEntity myEntity)  {

    MyEntity found = em.find(MyEntity.class, myEntity.getMyEntityPK());

    if (found == null) {
        em.merge(myEntity);
    } else {
        em.remove(found);
    }   
}

И, наконец, это лучший способ вернуть запись / сущность, но не сохранять дальнейшие изменения. Я беру запись, изменяю данные и затем отображаю (я мог бы поместить в DTO, но это кажется более аккуратным / меньше объектов)

public MyEntity getAnEntity(integer id){

    MyEntity myEntity = em.find(MyEntity.class, id);
    org.hibernate.Session session = (Session) em.getDelegate();
    session.evict(myEntity);
    return myEntity;
}

Для суммирования требуются ли аннотации к методам транзакций в slsb, и является ли session.evict лучшим способом остановить сохранение любых изменений?

Спасибо!

1 Ответ

3 голосов
/ 22 октября 2010

Для суммирования требуется аннотация к методам для транзакций в SLSB

Нет, они не обязательны .Вы можете применить аннотацию @TransactionAttribute на уровне класса, чтобы указать атрибут транзакции по умолчанию для всех бизнес-методов корпоративного компонента.Если вы этого не сделаете, ваш бин по умолчанию будет @TransactionAttribute(REQUIRED) (т. Е. Все методы обрабатываются по умолчанию).

и session.evict лучший способ остановить сохранение любых изменений?

  • JPA 1.0 имеет EntityManager#clear(), но это очистит контекст постоянства весь .
    • Если не требуется, то возврат к Session#evict(Object) действительно лучший вариант.
  • Если вы не используете JPA 2.0, в которомдело есть EntityManager#detach(Object) сейчас.
...