Мне нужно создать веб-приложение с расписанием, которое может копировать данные из базы данных 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).
Спасибо.