Hibernate 4 persist()有效,但merge()不起作用

时间:2016-05-16 18:00:15

标签: java hibernate transactions

我正在编写一个在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}}

0 个答案:

没有答案