我正在编写一个在Wildfly 8.2上运行并使用Hibernate 4的webapp。我已经成功地持久化了一个新实体,但似乎无法让它在之后提交更改。我有点假设它是一些错误的交易设置,但我不确定它是什么。我有一个服务层,我在其中设置事务设置,该层调用DAO层。这是一个例子:
public abstract class AbstractJpaDataAccessObject implements DataAccessObject
{
public <T extends UniqueObject<?>> T saveOrUpdate(
T obj) throws DAOException
{
try
{
if (obj.getId() == null)
{
this.em.persist(obj);
}
else
{
T attached = this.em.merge(obj);
this.em.flush();
return attached;
}
return obj;
}
catch (PersistenceException e)
{
throw new DAOException("[saveOrUpdate] obj=" + obj.toString() + ",msg=" + e.getMessage(), e);
}
}
}
并且基础DAO类具有此
@Entity
@Table(name = "user_registrations", schema = "campaigner")
public class UserRegistration extends AbstractUserRegistration
{
}
我知道我不需要调用flush(),但我想尝试一下,看看是否有帮助,但事实并非如此。
那么我错过了什么?
更新: 没有例外被抛出。从SecurityServiceBean.confirmRegistration()返回的对象具有在该方法中进行的所有更改。但是,查询数据库表明未提交更改。实体中的所有字段都没有标记为updateable = false。以下是一个例子。我将字段限制为“status”字段,这是我希望更新的字段之一。
@MappedSuperclass
public class AbstractUserRegistration extends CampaignerHistoryObject<Long>
{
public static enum State {
UNCONFIRMED, CONFIRMED, APPROVED, DENIED,
};
private State state;
@Column(name = "STATE")
public State getState()
{
return state;
}
}
和映射的超类。
<beans>
<!-- <aop:aspectj-autoproxy proxy-target-class="true"/> -->
<!--
SpringBeanAutowiringInterceptor needs this file.
We need SpringBeanAutowiringInterceptor to autowire the EJBs.
-->
<bean
class="org.springframework.context.support.ClassPathXmlApplicationContext">
<constructor-arg value="classpath:campaignerContext.xml" />
</bean>
</beans>
这是我使用的两个XML文件。第一个是beanRefContent.xml
<beans>
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="persistenceUnitName" value="campaigner" />
</bean>
<bean id="em" class="org.springframework.orm.jpa.support.SharedEntityManagerBean">
<property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>
</beans>
第二个是CampaignerContext.xml。
<persistence>
<persistence-unit name="campaigner" transaction-type="JTA">
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
<jta-data-source>java:/jdbc/CampaignerDS</jta-data-source>
...
<properties>
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLInnoDBDialect" />
<property name="hibernate.transaction.jta.platform" value="org.hibernate.service.jta.platform.internal.JBossAppServerJtaPlatform" />
<property name="jta.UserTransaction" value="java:jboss/UserTransaction" />
<property name="jta.TransactionManager" value="java:jboss/TransactionManager" />
</properties>
</persistence-unit>
</persistence>
更新2:现在我开始认为我的问题出在我的persistence.xml文件中,如下所示:
{{1}}