0
我有兩個實體 - IssueDTO
和TicketDTO
,幾乎完全相同。在客戶端,我讀取IssueDTO
和TicketDTO
的條目,然後通過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
?我是否必須編寫遠程服務才能與每個實體一起工作?
謝謝大家。
對不起,我似乎忘記將'saveOrUpdateIssue'方法註釋爲@Transactional(propagation = Propagation.REQUIRED,rollbackFor = Exception.class)'現在我檢查它。 –