EntityManager.merge ничего не делает

У меня есть объект User:

@Entity
@Table( name = "bi_user" )
@SequenceGenerator( name = "USER_SEQ_GEN", sequenceName = "USER_SEQUENCE" )
public class User
        extends DataObjectAbstract<Long>
{
    private static final long serialVersionUID = -7870157016168718980L;

    /**
     * key for this instance. Should be managed by JPA provider.
     */
    @Id
    @GeneratedValue( strategy = GenerationType.SEQUENCE, generator = "USER_SEQ_GEN" )
    private Long key;

    /**
     * Username the user will use to login.  This should be an email address
     */
    @Column( nullable=false, unique=true)
    private String username;

    // etc. other columns and getters/setters
}

Где DataObjectAbstract - это простой @MappedSuperClass , имеющий версию jpa и определение equals / hashcode.

У меня есть базовый класс dao, который выглядит так

public abstract class BaseDaoAbstract<T extends DataObject<K>, K extends Serializable>
        implements BaseDao<T, K>
{

    @PersistenceContext
    private EntityManager em;

    /**
     * Save a new entity. If the entity has already been persisted, then merge
     * should be called instead.
     * 
     * @param entity The transient entity to be saved.
     * @return The persisted transient entity.
     */
    @Transactional
    public T persist( T entity )
    {
        em.persist( entity );
        return entity;
    }

    /**
     * merge the changes in this detached object into the current persistent
     * context and write through to the database. This should be called to save
     * entities that already exist in the database.
     * 
     * @param entity The entity to be merged
     * @return The merged entity.
     */
    @Transactional
    public T merge( T entity )
    {
        return em.merge( entity );
    }

    // other methods like persist, delete, refresh, findByKey that all delegate to em.
}

Я определил фильтр OpenEntityManagerInView в web.xml следующим образом

<filter>
    <filter-name>openEntityManagerInViewFilter</filter-name>
    <filter-class>
        org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter
    </filter-class>
    <init-param>
        <param-name>entityManagerFactoryBeanName</param-name>
        <param-value>biEmf</param-value>
    </init-param>
</filter>

<filter-mapping>
    <filter-name>openEntityManagerInViewFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

Я недавно обновился до eclipselink 2.3.2 и Spring 3.1 и преобразовал прокси CGLIB во время загрузки Плетение с аспектомJ для Spring, но я не настраивал LTW для eclipselink.

Проблема в этом коде, который живет в Spring ApplicationListener, см. Комментарии.

        User user = userService.findByKey(userDetails.getKey());

        // THIS MERGE NEVER WRITES THROUGH TO THE DATABASE.
        // THIS DOESN'T WORK AS PERSIST EITHER
        user = userService.merge( user.loginSuccess() );

user.loginSuccess просто устанавливает некоторые поля и возвращает this Я уверен, что он проходит через код, потому что я получаю сообщения журнала вокруг него, и я могу установить точку останова и пройти по нему. В моем журнале postgres не отображается трафик, поступающий в postgres для слияния.

Я без проблем сохраняю повсюду другие данные, включая пользователей в другом месте, когда они меняют свой пароль, и я знаю, что этот код работал. Здесь что-то явно не так? Я неправильно использую OpenEntityManagerInViewFilter? Должен ли я быть в методе @Transactional, чтобы объекты считались управляемыми? Любая помощь приветствуется.

Обновление Я попробовал смыть, как подсказал Праджиш. Вот код

@Transactional
public T merge( T entity )
{
    entity = em.merge( entity );
    em.flush();
    return entity;
}

в классе в com.bi.data . У меня это есть в конфигурационном файле моего весеннего приложения

<context:component-scan base-package="com.bi.controller,com.bi.data,com.bi.web" />

В моей весенней конфигурации у меня есть

<context:load-time-weaver/>
<tx:annotation-driven mode="aspectj"/>    

с aop.xml, который выглядит следующим образом:

<aspectj>
    <weaver>
        <!-- only weave classes in our application-specific packages -->
        <include within="com.bi..*"/>
    </weaver>
</aspectj>

и у меня есть

javax.persistence.TransactionRequiredException: 
Exception Description: No transaction is currently active

Значит, что-то явно неправильно сконфигурировано, но что?

Обновление 2: Я отменил свои изменения, чтобы включить изменение времени загрузки, и теперь слияние происходит с или без сброса, но я все еще не понимаю, в чем проблема с LTW ...

12
задан digitaljoel 31 January 2012 в 04:50
поделиться