Java Hibernate 4 persist()工作,但merge()不工作
我正在编写一个在Wildfly 8.2上运行并使用Hibernate 4的Web应用程序。我已经让它成功地持久化了一个新实体,但似乎无法让它在以后提交更改。我有点假设我的一些事务设置是错误的,但我不确定它是什么。我有一个服务层,在其中设置事务设置,该层调用DAO层。下面是一个例子:Java Hibernate 4 persist()工作,但merge()不工作,java,hibernate,transactions,Java,Hibernate,Transactions,我正在编写一个在Wildfly 8.2上运行并使用Hibernate 4的Web应用程序。我已经让它成功地持久化了一个新实体,但似乎无法让它在以后提交更改。我有点假设我的一些事务设置是错误的,但我不确定它是什么。我有一个服务层,在其中设置事务设置,该层调用DAO层。下面是一个例子: @Transactional @EnableTransactionManagement @TransactionManagement(value = TransactionManagementType.CONTAIN
@Transactional
@EnableTransactionManagement
@TransactionManagement(value = TransactionManagementType.CONTAINER)
@TransactionAttribute(value = TransactionAttributeType.REQUIRED)
@Stateless
@Interceptors(SpringBeanAutowiringInterceptor.class)
@DeclareRoles("Security Admin")
public class SecurityServiceBean
{
@Override
@PermitAll
public UserRegistration confirmRegistration(
String confirmationCode) throws ApplicationException
{
try
{
QueryResults<UserRegistration> userRegistrations = this.userRegistrationDAO
.find(new UserRegistrationQuery(null, confirmationCode));
if (userRegistrations.getTotalRecords() == 1)
{
UserRegistration userRegistration = userRegistrations.uniqueResult();
if (userRegistration.getConfirmationDate() == null)
{
userRegistration.setConfirmationDate(new Date());
userRegistration.setState(State.CONFIRMED);
userRegistration = this.userRegistrationDAO.saveOrUpdate(userRegistration);
...
}
...
}
}
}
}
以及映射的超类
@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;
}
}
@MappedSuperclass
公共类AbstractUserRegistration扩展了ActivaterHistoryObject
{
公共静态枚举状态{
未确认、确认、批准、拒绝、,
};
私营国家;
@列(name=“STATE”)
公共状态getState()
{
返回状态;
}
}
这里是我使用的两个XML文件。第一个是beanRefContent.xml
<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>
第二个是ActivaterContext.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>
更新2:现在我开始认为我的问题在于persistence.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>
org.hibernate.jpa.HibernatePersistenceProvider
java:/jdbc/activaterds
...
调用合并时会出现什么行为或异常?堆栈跟踪或至少底层异常非常有用。只需检查实体中是否有任何字段标记为Updateable=False。请参阅本文我使用的是容器管理事务(CMT),而不是用户管理事务,因此我无法使用em.getTransaction()更新了帖子,提供了更多信息。调用合并时会出现什么行为或异常?堆栈跟踪或至少底层异常是有帮助的。只需检查实体中是否有任何字段标记为Updateable=False。请参阅本文我使用的是容器管理事务(CMT),而不是用户管理事务,因此我无法使用em.getTransaction()更新的文章,其中包含更多信息。
<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>
<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>