Вставка данных в связанные репозитории в ATG

У меня есть требование, в котором у меня есть две таблицы employee в репозитории ABC и address_details в репозитории XYZ.

Один столбец employee имеет ссылку внешнего ключа на address_details.

Здесь у меня есть primaryKey для address_details, и с этой ссылкой primaryKey я должен вставить свои данные в employee.

Итак, мой RDF выглядит примерно так:

RDF 1: (Репозиторий 1: ABC)

<item-descriptor name=”employee” >
 <table name=”employee”>
   <property name=”empId” data-type=”string” column-name=”emp_id”
     required=”true”/>
   <property name=”address” column-name=”address_id” item-type=”address”
     repository=”XYZ” required=”true”/>
 </table>
</item-descriptor>

RDF 2: (Репозиторий 2: XYZ)

<item-descriptor name=”address” >
  <table name=”address_details”>
    <property name=”addressId” data-type=”string” column-name=”address_id”/>
    <property name=”streetName” column-name=”street_name” data-type=”string”/>
    <property name=”city” column-name=”city” data-type=”string” />
  </table>
</item-descriptor>

У меня все адреса хранятся в таблице address_details. И я должен сопоставить employee с этими адресами.

Способ, который я здесь пытаюсь использовать, заключается в том, чтобы сначала получить RepostoryItem из Address, затем установить тип свойства address из employee и добавить его в таблицу employee. Это работает.

Но я хочу вставить данные employee только за один вызов?

Любые предложения о том, как я могу сделать это, используя RepositoryItem или MutableRepositoryItem?


atg
person vadinee porwal    schedule 29.11.2011    source источник
comment
Зачем вам связываться в один звонок? Само собой разумеется, что если вы хотите связать их, вы должны сначала найти элементы, которые вы хотите связать, а затем выполнить ассоциацию. Нет ничего плохого в том, чтобы сначала выполнить необходимые поиски, а затем обновить элемент сотрудника, когда вы найдете соответствующий элемент адреса.   -  person chrisjleu    schedule 17.08.2012


Ответы (1)


Под вставкой за один вызов я предполагаю, что вы имеете в виду, что хотите зафиксировать все вставки атомарно. Не существует механизма для выполнения нескольких вставок в одном операторе SQL — вам придется вызывать MutableRepository.addItem() один раз для каждого созданного вами элемента. Следующий код позволит вам обернуть работу с репозиторием в транзакцию, чтобы все данные были зафиксированы сразу.

TransactionManager tm = ...
TransactionDemarcation td = new TransactionDemarcation ();
try {
  try {
    td.begin(tm);

    // Create all items and call MutableRepository.addItem() for each of them.
  }
  finally {
    td.end();
  }
}
catch (TransactionDemarcationException exc) {
  logError(exc);
}
person jsears    schedule 28.11.2012