Я нашел проблему и обходной путь после долгого сеанса отладки.
// incomplete code example
for(Object table : db.getTables()) {
ITable t = (ITable)((ITable)table).clone(true);
System.out.println(t.getName());
// modifying t, bag is an existing instance of class PropertyBag
t.getConnectionInfo().setAttributes(bag);
// dc is an existing instance of DatabaseController
dc.setTableLocation((ITable)table, t)
}
db.getTables()
содержит 3 таблицы A, B и C. Если мы выполним приведенный выше код, System.out
выводит A, A, B на консоль.
Если мы собираемся комментировать dc.setTableLocation((ITable)table, t)
out. A, B, C будут напечатаны. Я предполагаю, что dc.setTableLocation((ITable)table, t)
внутренне изменяет список таблиц.
Мы используем следующий обходной путь:
// incomplete code example
// WORKAROUND CODE
Map<ITable, ITable> oldNewMap = new HashMap<ITable, ITable>();
for(Object table : db.getTables()) {
ITable t = (ITable)((ITable)table).clone(true);
System.out.println(t.getName());
// modifying t, bag is an existing instance of class PropertyBag
t.getConnectionInfo().setAttributes(bag);
// WORKAROUND CODE
oldNewMap.put((ITable)table, t);
}
// WORKAROUND CODE
for (Entry<ITable, ITable> e : oldNewMap.entrySet()) {
dc.setTableLocation(e.getKey(), e.getValue());
}
Я надеюсь, что кто-то сэкономит время и деньги с этим обходным путем. ;-) Я также разместил его на официальном форуме.
Форум: Java Development - Crystal Reports