2013-09-21 59 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數據庫回滾它。

現在一切正常。

相關問題