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();
}