2013-09-21 60 views
0

我有两个实体 - IssueDTOTicketDTO,几乎完全相同。在客户端,我读取IssueDTOTicketDTO的条目,然后通过RPC将它们保存在数据库中。一个实体被保存,另一个不存在 - 为什么?

表示层 -

... 
private void saveIssue() { 
    IssueDTO issueDTO = new IssueDTO(...); 

    ticketService.saveOrUpdateIssue(issueDTO, new AsyncCallback<Void>() { 
      public void onFailure(Throwable caught) { 
      // ... 
      } 
      public void onSuccess(Void noAnswer) { 
      // ... 
      } 
     }); 
} 

... 
private void saveTicket() { 
    TicketDTO ticketDTO = new TicketDTO(...); 

    ticketService.saveOrUpdateTicket(ticketDTO, new AsyncCallback<Void>() { 
      public void onFailure(Throwable caught) { 
      // ... 
      } 
      public void onSuccess(Void noAnswer) { 
      // ... 
      } 
     }); 
} 

DAO层 -

TicketDAO -

@Repository("ticketDAO") 
public class TicketDAO extends AbstractHibernateJpaDAO<Long, TicketDTO> { 

    @PersistenceContext(unitName = "PersistenceUnit") 
    EntityManager entityManager; 

    @Override 
    protected EntityManager getEntityManager() { 
     return entityManager; 
    } 
} 

IssueDAO -

@Repository("issueDAO") 
public class IssueDAO extends AbstractHibernateJpaDAO<Long, IssueDTO> { 

    @PersistenceContext(unitName = "PersistenceUnit") 
    EntityManager entityManager; 

    @Override 
    protected EntityManager getEntityManager() { 
     return entityManager; 
    } 
} 

只保存实体TicketDTO,我可以检索它们。但是当我尝试保存并提取实体IssueDTO时,要更新客户端小部件 - 什么都不会回来,但客户端收到消息IssueDTO已成功保留,并执行onSuccess方法。

服务层 -

在servlet TicketServiceImpl的方法,我使用存储实体(方法是相似的) -

... 
    @Autowired 
    private IssueDAO issueDAO; 
    @Autowired 
    private TicketDAO ticketDAO; 

    public void saveOrUpdateIssue(IssueDTO issueDTO) throws Exception { 
     // TODO Auto-generated method stub 
     try { 
      if(issueDTO.getIssueId() == null) { 
       issueDAO.persist(issueDTO); 
      } else { 
       issueDAO.merge(issueDTO); 
      } 
     } catch (Exception e) { 
      LOG.error(e); 
      throw e; 
     } 
    } 
... 

在我使用来提取实体servlet的方法 -

0 -

... 
public List<IssueDTO> findAllIssues() { 
    // TODO Auto-generated method stub 
    List<IssueDTO> findAll = issueDAO.findAll(); 
    List<IssueDTO> result = new ArrayList<IssueDTO>(); 

    for(IssueDTO issue : findAll) { 
     result.add(new IssueDTO(issue)); 
    } 
    return result; 
} 
... 

在类AbstractHibernateJpaDAO,这是我继承的方法

public abstract class AbstractHibernateJpaDAO<K, E> { 
    protected Class<E> entityClass; 

    @SuppressWarnings("unchecked") 
    public AbstractHibernateJpaDAO() { 
     ParameterizedType genericSuperclass = (ParameterizedType) getClass() 
       .getGenericSuperclass(); 
     entityClass = (Class<E>) genericSuperclass.getActualTypeArguments()[1]; 
    } 
    ... 

    @SuppressWarnings("unchecked") 
    public List<E> findAll() { 
     String queryStr = "SELECT h FROM " + entityClass.getName() + " h";  
     Query query = getEntityManager().createQuery(queryStr, entityClass);  
     List<E> resultList = query.getResultList(); 

     return resultList; 
    } 

    public void persist(E entity) { 
     getEntityManager().persist(entity); 
    } 

    public E merge(E entity) { 
     return getEntityManager().merge(entity); 
    } 
    ... 

applicationContext.xml -

<beans ... > 

    <context:annotation-config /> 
    <tx:annotation-driven /> 
    <context:component-scan base-package="com.mypackage.default" /> 

    <bean class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean" id="entityManagerFactory"> 
     <property name="persistenceUnitName" value="PersistenceUnit" /> 
    </bean> 

    <bean class="org.springframework.orm.jpa.JpaTransactionManager" id="transactionManager"> 
     <property name="entityManagerFactory" ref="entityManagerFactory" /> 
    </bean> 

</beans> 

为什么只存储TicketDTO,但不存储IssueDTO?我是否必须编写远程服务才能与每个实体一起工作?

谢谢大家。

+0

对不起,我似乎忘记将'saveOrUpdateIssue'方法注释为@Transactional(propagation = Propagation.REQUIRED,rollbackFor = Exception.class)'现在我检查它。 –

回答

0

我想通了。有必要指定交易界限(我忘了这么做)。

@Transactional (propagation=Propagation.REQUIRED, rollbackFor=Exception.class) 

否则,结果是非确定性的并且取决于数据库驱动程序。 在我的情况下,休眠打开一个事务,但驱动程序H2数据库回滚它。

现在一切正常。

相关问题