Java EntityManager.merge不执行任何操作

Java EntityManager.merge不执行任何操作,java,spring,jpa,eclipselink,Java,Spring,Jpa,Eclipselink,我有一个用户实体: @Entity @Table( name = "bi_user" ) @SequenceGenerator( name = "USER_SEQ_GEN", sequenceName = "USER_SEQUENCE" ) public class User extends DataObjectAbstract<Long> { private static final long serialVersionUID = -787015701616

我有一个用户实体:

@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
}
我在web.xml中定义了OpenEntityManagerView过滤器,如下所示

<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>
user.loginsucess只是设置一些字段并返回
这个
我确信它正在遍历代码,因为我在它周围有日志语句,我可以设置断点并遍历它。我的postgres日志没有显示任何访问postgres进行合并的流量

我把其他的东西保存得到处都是,没有问题,包括用户在另一个地方更改密码时,我知道这个代码过去是有效的。这里有什么明显的问题吗?我是否错误地使用了OpenEntityManagerInViewFilter?我是否需要使用@Transactional方法才能将实体视为受管理的实体?感谢您的帮助

更新 我按照普拉吉什的建议试了一下冲水。这是密码

@Transactional
public T merge( T entity )
{
    entity = em.merge( entity );
    em.flush();
    return entity;
}
com.bi.data
中的类中。我的spring应用程序配置文件中有这个

<context:component-scan base-package="com.bi.controller,com.bi.data,com.bi.web" />
所以有些东西显然被误解了,但是什么呢

更新2:
我恢复了我的更改以启用加载时编织,现在合并可以通过刷新,也可以不通过刷新,但我仍然不明白LTW的问题是什么…

em.merge()
之后尝试
em.merge()
。有时,
EntityManager
只是保留更改以便以后更新。

我遇到了问题,通过更改范围得到了解决

@PersistenceContext(type=PersistenceContextType.EXTENDED)

ref:

事务处理.begin()和
事务处理.end()方法在哪里?在RESOURCE_LOCAL中,您应该管理事务,而不是应用程序…

检查Spring配置文件中是否有以下行:
这将启用@Transactional annotation支持,并确保设置了mode=“proxy”而不是mode=“aspectj”

EntityManager自动提交为false。请使用如下交易方式

EntityManager em = null;
EntityTransaction t = null;
try {
    em = emf.createEntityManager();
    t = em.getTransaction();
    t.begin();
    em.merge(myTestObject);
    t.commit();
} catch (Exception e) {
    t.rollback();
    throw new RuntimeException(e.getMessage());
}finally{
    if(em != null)
        em.close();
}

看起来您已经正确配置了事务。可能包括persistence.xml,确保您使用的是本地资源。启用登录finest以查看正在发生的事情。感谢您的想法。下班后我会看一看。我非常确定我们使用的是RESOURCE_LOCAL,因为我们在tomcat中运行,所以JTA从未使用过。您是否尝试过将propagation=propagation.REQUIRED添加到@Transactional注释中?我没有尝试过。我在问题的更新2中进行了更改,没有回头看。我正在使用jpa,它不允许em.getTransaction(),有时jpa在路径中找不到persistence.xml文件。persistence.xml路径在哪里?如果您的em为null,请将persistence.xml移到src/main/java/META-INF/persistence.xml,在一个大项目中搜索几个月,谢谢!
<context:load-time-weaver/>
<tx:annotation-driven mode="aspectj"/>    
<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
@PersistenceContext(type=PersistenceContextType.EXTENDED)
EntityManager em = null;
EntityTransaction t = null;
try {
    em = emf.createEntityManager();
    t = em.getTransaction();
    t.begin();
    em.merge(myTestObject);
    t.commit();
} catch (Exception e) {
    t.rollback();
    throw new RuntimeException(e.getMessage());
}finally{
    if(em != null)
        em.close();
}