AnySimpleType est traité de la même manière que les autres types simples (chaîne, int, booléen, etc.) par les API SDO.
Les seules différences entre anySimpleType et les autres types simples sont dans ses données d'instance et la sérialisation/désérialisation. Elles doivent être des concepts internes pour les objets métier uniquement, et elles sont utilisées pour déterminer si les données mappées vers ou depuis le champ sont valides. Si une méthode set(...) devait être appelée sur un type de chaîne, les données seraient d'abord converties en une chaîne, et les données d'origine seraient perdues :
<?xml version="1.0" encoding="UTF-8"?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://StringType"> <xsd:complexType name="StringType"> <xsd:sequence> <xsd:element name="foo" type="xsd:string"/> </xsd:sequence> </xsd:complexType> </xsd:schema> DataObject stringType = ... // Définir les données sur une chaîne stringType.set("foo", "bar"); // Les données d'instance seront toujours du type chaîne, quelles que soient les données définies // Affiche "java.lang.String" System.out.println(stringType.get("foo").getClass().getName()); // Définir les données sur un nombre entier stringType.set("foo", new Integer(42)); // Les données d'instance seront toujours du type chaîne, quelles que soient les données définies // Affiche "java.lang.String" System.out.println(stringType.get("foo").getClass().getName());
Un élément anySimpleType à la place ne perd pas le type de données d'origine de ce qui est défini :
<?xml version="1.0" encoding="UTF-8"?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://AnySimpleType"> <xsd:complexType name="AnySimpleType"> <xsd:sequence> <xsd:element name="foo" type="xsd:anySimpleType"/> </xsd:sequence> </xsd:complexType> </xsd:schema> DataObject anySimpleType = ... // Définir les données sur une chaîne stringType.set("foo", "bar"); // Les données d'instance seront toujours du type date utilisé dans l'ensemble // Affiche "java.lang.String" System.out.println(stringType.get("foo").getClass().getName()); // Définir les données sur un nombre entier stringType.set("foo", new Integer(42)); // Les données d'instance seront toujours du type date utilisé dans l'ensemble // Affiche "java.lang.Integer" System.out.println(stringType.get("foo").getClass().getName());
Ce type de données est également préservé lors de la sérialisation et désérialisation par xsi:type. En conséquence, à chaque fois que vous sérialisez un élément anySimpleType, il aura un xsi:type qui correspond à celui défini dans la spécification SDO en fonction de son type Java™ :
Dans l'exemple suivant, vous sérialisez l'objet métier ci-dessus de telle sorte que les données ressembleront à :
<?xml version="1.0" encoding="UTF-8"?> <p:StringType xsi:type="p:StringType" xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance xmlns:xsd=http://www.w3.org/2001/XMLSchema xmlns:p="http://StringType"> <foo xsi:type="xsd:int">42</foo> <p:StringType></p:StringType>
Le xsi:type sera utilisé lors de la désérialisation pour charger les données comme classe d'instance Java appropriée. Si aucun xsi:type n'est spécifié, le type de désérialisation par défaut sera une chaîne.
Pour les autres types simples, déterminer la mappabilité est une constante. Par exemple, un élément booléen peut toujours mapper une chaîne. AnySimpleType peut contenir n'importe quel type simple, mais un mappage peut être possible ou non, en fonction des données d'instance dans le champ.
Utilisez le type de propriété URI et Nom pour déterminer si une propriété est du type anySimpleType. Il s'agira de "commonj.sdo" et "Object". Pour déterminer si des données sont valides pour être insérées dans anySimpleType, vérifiez s'il ne s'agit pas d'une instance d'un objet de données. Toutes les données pouvant être représentées sous la forme d'une chaîne et n'étant pas un objet de données peuvent être définies dans un champ anySimpleType.
Les règles de mappage sont donc les suivantes :