Связывание Java с межсистемным кешем

Я новичок в Cache, и я пытаюсь использовать привязку Java, и у меня есть некоторые проблемы с этим.

1) Я хочу добавить запись в базу данных с помощью кода

              Database dbconnection = CacheDatabase.getDatabase (url, username, password);

              Patient patient = new Patient(dbconnection);
              patient.setFIO("Antonov Kirill Vladimirovich");

              Diary diary = new Diary(dbconnection);
              diary.setData("Very bad.");
              diary.setDate(new java.sql.Date(2015,11,12));
              diary.setStatus("Unsatisfied");

              ListOfObjects obj = new ListOfObjects(dbconnection);
              obj.add(diary);
              patient.listOfDiariesSetObject(new Oid(obj));

              dbconnection.saveAllObjects();

Этот код вызывает

Exception in thread "main" java.lang.ClassCastException: com.intersys.classes.ListOfObjects cannot be cast to com.intersys.jdbc.SysList
    at com.intersys.jdbc.SysListProxy.getBinaryData(SysListProxy.java:516)
    at com.intersys.objects.Oid.getData(Oid.java:101)
    at com.intersys.cache.Dataholder.<init>(Dataholder.java:378)
    at smda.Patient.listOfDiariesSetObject(Patient.java:1565)
    at etu.wollen.cache.DBConnector.main(DBConnector.java:34)

Как мне правильно преобразовать ListOfObjects в Oid?

2) Как мне удалить некоторые записи из базы данных? Я нашел только методы сохранения в com.intersys.objects.Database с использованием \Dev\java\samples\doc

3) Большинство классов, таких как com.intersys.objects.Database, com.intersys.objects.CacheException, ... устарели. Но официальная документация по-прежнему использует эти классы. Должен ли я использовать устаревшие классы?

Patient

    Class smda.Patient Extends %Persistent
{

Property FIO As %String;

Property RegNumber As %String;

Property MedCardNumber As %String;

Property listOfDiaries As list Of Diary;

Property listOfEpisodes As list Of Episode;

Storage Default
{
<Data name="PatientDefaultData">
<Value name="1">
<Value>%%CLASSNAME</Value>
</Value>
<Value name="2">
<Value>FIO</Value>
</Value>
<Value name="3">
<Value>RegNumber</Value>
</Value>
<Value name="4">
<Value>MedCardNumber</Value>
</Value>
<Value name="5">
<Value>listOfDiaries</Value>
</Value>
<Value name="6">
<Value>listOfEpisodes</Value>
</Value>
</Data>
<DataLocation>^smda.PatientD</DataLocation>
<DefaultData>PatientDefaultData</DefaultData>
<IdLocation>^smda.PatientD</IdLocation>
<IndexLocation>^smda.PatientI</IndexLocation>
<StreamLocation>^smda.PatientS</StreamLocation>
<Type>%Library.CacheStorage</Type>
}

Projection PatientJava As %Projection.Java(ROOTDIR = "C:\Projects\Cache\Java");

}

Diary 

    Class smda.Diary Extends %Persistent
{

Property Data As %Text(MAXLEN = 1000);

Property Status As %String;

Property Date As %Date;

Storage Default
{
<Data name="DiaryDefaultData">
<Value name="1">
<Value>%%CLASSNAME</Value>
</Value>
<Value name="2">
<Value>Data</Value>
</Value>
<Value name="3">
<Value>Status</Value>
</Value>
<Value name="4">
<Value>Date</Value>
</Value>
</Data>
<DataLocation>^smda.DiaryD</DataLocation>
<DefaultData>DiaryDefaultData</DefaultData>
<IdLocation>^smda.DiaryD</IdLocation>
<IndexLocation>^smda.DiaryI</IndexLocation>
<StreamLocation>^smda.DiaryS</StreamLocation>
<Type>%Library.CacheStorage</Type>
}

}

person NomaD    schedule 11.12.2015    source источник
comment
вы почти наверняка получите лучшие ответы, если будете задавать конкретные вопросы. Я ответил на вопрос (1) выше, но не могу вам помочь по пунктам (2) или (3).   -  person DdP    schedule 11.12.2015
comment
Можете ли вы добавить, как выглядят классы Cache? Я имею в виду «Пациента и дневник».   -  person DAiMor    schedule 12.12.2015
comment
да. Я добавил классы к вопросу.   -  person NomaD    schedule 12.12.2015


Ответы (2)


1) Просто получите значение для этого свойства, оно должно содержать значение типа java.util.List. И затем вы можете манипулировать этим списком, например, добавлять свое значение.
вместо

          ListOfObjects obj = new ListOfObjects(dbconnection);
          obj.add(diary);
          patient.listOfDiariesSetObject(new Oid(obj));

должно быть

        List diaries = patient.getlistOfDiaries();
        diaries.add(diary);

2) Каждый класс Caché имеет свой метод создания (%New), открытия (%OpenId) и удаления (%DeleteId) по id объектов этих классов. И у проецируемых классов есть свои такие статические методы. Здесь в документации можно увидеть некоторые подробности о проекционных классах. Итак, вы можете вызвать такой код для удаления объекта с Id=1:

Patient.sys_DeleteId(dbconnection, 1);

3) Не уверен, но думаю, что это из-за Caché eXTreme, который должен заменить cachedb.jar. Подробнее о Java Caché eXTreme можно прочитать здесь.

person DAiMor    schedule 13.12.2015

Я думаю, что ответ на ваш первый вопрос находится в вашем коде. Я думаю, вы можете изменить этот раздел:

ListOfObjects obj = new ListOfObjects(dbconnection);
obj.add(diary);
patient.listOfDiariesSetObject(new Oid(obj));

быть следующим:

patient.listOfDiariesSetObject(new Oid(diary));

Ваш исходный код создает экземпляр ListOfObjects, который затем вставляется в свойство listOfDiaries, а не вставляется экземпляр Diary в список.

person DdP    schedule 11.12.2015
comment
Мне не помогло :( Выкинул такое же исключение: Exception in thread "main" java.lang.ClassCastException smda.Diary cannot be cast to com.intersys.jdbc.SysList at com.intersys.jdbc.SysListProxy.getBinaryData(SysListProxy.java:516). Ожидается что-то совместимое с com.intersys.jdbc.SysList - person NomaD; 12.12.2015