Не удается сохранить / объединить с использованием JTA CMT - PullRequest
0 голосов
/ 03 февраля 2012

Мне нужно создать веб-приложение с расписанием, которое может копировать данные из базы данных Oracle в базу данных MSSQL.Все скомпилированные коды и таблицы успешно созданы в MSSQL DB после развертывания веб-приложения.

Но извлечение данных из oracle просто не сохраняется / не объединяется в БД MSSQL, без исключений или вообще.

Есть предложения, почему они не работают?

persistent.xml с 2 PU (работает нормально после советов по поиску)

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
  <persistence-unit name="sourcePU" transaction-type="JTA">
    <jta-data-source>sourceConn</jta-data-source>
    <exclude-unlisted-classes>false</exclude-unlisted-classes>
    <shared-cache-mode>ENABLE_SELECTIVE</shared-cache-mode>
    <properties>
      <property name="eclipselink.canonicalmodel.subpackage" value="sourceName"/>
    </properties>
  </persistence-unit>
  <persistence-unit name="destPU" transaction-type="JTA">
    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
    <jta-data-source>destConn</jta-data-source>
    <exclude-unlisted-classes>false</exclude-unlisted-classes>
    <shared-cache-mode>ENABLE_SELECTIVE</shared-cache-mode>
    <properties>
      <property name="eclipselink.canonicalmodel.subpackage" value="destName"/>
      <property name="eclipselink.ddl-generation" value="create-tables"/>
    </properties>
  </persistence-unit>
</persistence>

Объекты генерируются автоматически, а таблицы создаются на их основе, поэтому я их опущу.

Компонент, отвечающий за репликацию.

@Stateless
@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
public class FacadeReplicator {

    @PersistenceContext(unitName = "sourcePU") 
    private EntityManager emSource;    
    @PersistenceContext(unitName = "destPU") 
    private EntityManager emDest;

    protected EntityManager getEntityManagerSource() {
        return emSource;
    }

    protected EntityManager getEntityManagerDest() {
        return emDest;
    }

    public JourneyFacadeReplicator() {
        //super(Journey.class);
    }

    private List<MyEntity> getData(Timestamp fromDate, Timestamp toDate) {
        return getEntityManagerSource().createNamedQuery("MyEntity.findBetweenDates", MyEntity.class).setParameter("fromDate", fromDate, TemporalType.TIMESTAMP).setParameter("toDate", toDate, TemporalType.TIMESTAMP).getResultList();   
    }

    @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
    public int findMyEntityBetweenDates(Timestamp fromDate, Timestamp toDate) {
        List<MyEntity> test = getData(fromDate, toDate);

        Iterator<MyEntity> iter = test.iterator();
        while (iter.hasNext()) {
            MyEntity toUpdate = iter.next();
            getEntityManagerDest().merge(toUpdate);
            //getEntityManagerDest().flush();
        }
        return 1;
    }        
}

Вот вызывающая сторона / расписание

@Stateless
public class Scheduler {   
    @EJB
    FacadeReplicator replicator;

    @Schedule(second="*", minute="*/2",hour="*", persistent=false)
    public void doWork(){
        Timestamp fromDate = Timestamp.valueOf("2011-06-24 00:00:00");
        Timestamp toDate = Timestamp.valueOf("2011-06-24 02:00:00");
        replicator.findMyEntityBetweenDates(fromDate, toDate);
    }        
}

PS:Я использую netbean 7.0.1, EJB 3 (или 3.1?), Glassfish 3.1.1, eclipselink, JTA CMT, Oracle DB 10g (ojdbc14), MSSQL 2008 (последняя версия jdbc).

Спасибо.

...