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)'现在我检查它。 –