使用Intersystems Cache进行Java绑定

时间:2015-12-11 18:48:25

标签: intersystems-cache

我是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,....但官方的docbook仍然使用theese类。我应该使用弃用的类吗?

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>
}

}

2 个答案:

答案 0 :(得分:1)

我认为你的第一个问题的答案就在你的代码中。我想你可以修改这一部分:

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

如下:

patient.listOfDiariesSetObject(new Oid(diary));

您的初始代码正在创建一个ListOfObjects实例,然后将其插入listOfDiaries属性,而不是将Diary实例插入列表中。

答案 1 :(得分:0)

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),open(%OpenId)和删除(%DeleteId)这个类的id对象。而且,预计的类有自己的静态方法。在文档中Here,您可以看到有关投影类的一些详细信息。因此,您可以调用此类代码,对于Id = 1的删除对象:

Patient.sys_DeleteId(dbconnection, 1);

3)不确定,但我认为这是因为CachéeXTreme应该取代cachedb.jar。您可以阅读有关JavaCachéeXTremehere的更多信息。