2013-09-21 1 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 메서드를 실행합니다.

서비스 계층 - 서블릿 TicketServiceImpl

있어서, I는 (방법이 유사) 저장소 엔티티에 사용하는 -

... 
    @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; 
     } 
    } 
... 

I 엔티티를 추출 할 때 사용하는 서블릿에있어서 -

0 - 내가 상속 클래스 AbstractHibernateJpaDAO

... 
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; 
} 
... 

방법

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 데이터베이스를 롤백합니다.

이제 모든 것이 정상입니다.

관련 문제