Java 与系统间缓存绑定
Java Binding with 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 仍然使用这些 类。我应该使用已弃用的 类 吗?
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>
}
}
我认为您的第一个问题的答案在您的代码中。我想你可以修改这部分:
ListOfObjects obj = new ListOfObjects(dbconnection);
obj.add(diary);
patient.listOfDiariesSetObject(new Oid(obj));
如下:
patient.listOfDiariesSetObject(new Oid(diary));
您的初始代码正在创建一个 ListOfObjects
实例,然后您将其插入 listOfDiaries
属性,而不是将您的 Diary
实例插入列表。
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é class 都有自己的方法,用于通过此 classes 的 id 对象创建 (%New)、打开 (%OpenId) 和删除 (%DeleteId)。并且,预计 classes,有自己的静态方法。 Here 在文档中,您可以看到有关投影 classes 的一些详细信息。因此,您可以调用这样的代码,用于删除 Id=1:
的对象
Patient.sys_DeleteId(dbconnection, 1);
3) 不确定,但我认为这是因为 Caché eXTreme,它应该取代 cachedb.jar。您可以阅读更多关于 Java Caché eXTreme here。
我是 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 仍然使用这些 类。我应该使用已弃用的 类 吗?
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>
}
}
我认为您的第一个问题的答案在您的代码中。我想你可以修改这部分:
ListOfObjects obj = new ListOfObjects(dbconnection);
obj.add(diary);
patient.listOfDiariesSetObject(new Oid(obj));
如下:
patient.listOfDiariesSetObject(new Oid(diary));
您的初始代码正在创建一个 ListOfObjects
实例,然后您将其插入 listOfDiaries
属性,而不是将您的 Diary
实例插入列表。
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é class 都有自己的方法,用于通过此 classes 的 id 对象创建 (%New)、打开 (%OpenId) 和删除 (%DeleteId)。并且,预计 classes,有自己的静态方法。 Here 在文档中,您可以看到有关投影 classes 的一些详细信息。因此,您可以调用这样的代码,用于删除 Id=1:
的对象Patient.sys_DeleteId(dbconnection, 1);
3) 不确定,但我认为这是因为 Caché eXTreme,它应该取代 cachedb.jar。您可以阅读更多关于 Java Caché eXTreme here。