inheritance - que - jpa with hibernate
EclipseLink MOXy: anula las reglas de archivos vinculantes (1)
Es un poco extraño mapear la propiedad de text
diferente en las clases super y sub. Si esto es algo que realmente quieres hacer, a continuación hay una forma de lograrlo.
Modelo de Java
Superclase
package forum17982654;
public class SuperClass {
private String text;
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
}
Subclase
Anularemos los métodos de acceso de la superclase. Esto nos ayudará a engañar a MOXy para que piense que SubClass
tiene su propio text
propiedad.
package forum17982654;
public class SubClass extends SuperClass {
@Override
public String getText() {
return super.getText();
}
@Override
public void setText(String text) {
super.setText(text);
}
}
Metadata
bindings.xml
En el documento de mapeo le diremos a MOXy que la súper clase real de SubClass
es java.lang.Object
.
<?xml version="1.0"?>
<xml-bindings
xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm"
package-name="forum17982654">
<java-types>
<java-type name="SuperClass">
<xml-root-element/>
<java-attributes>
<xml-attribute java-attribute="text"/>
</java-attributes>
</java-type>
<java-type name="SubClass" super-type="java.lang.Object">
<xml-root-element/>
<java-attributes>
<xml-value java-attribute="text"/>
</java-attributes>
</java-type>
</java-types>
</xml-bindings>
Código de demostración
A continuación se muestra un código de demostración que puede ejecutar para probar que todo funciona:
Manifestación
package forum17982654;
import java.io.StringReader;
import java.util.*;
import javax.xml.bind.*;
import org.eclipse.persistence.jaxb.JAXBContextFactory;
import org.eclipse.persistence.jaxb.JAXBContextProperties;
public class Demo {
public static void main(String[] args) throws Exception {
Map<String, Object> jaxbContextProperties = new HashMap<String, Object>(1);
jaxbContextProperties.put(JAXBContextProperties.OXM_METADATA_SOURCE, "bindings.xml");
JAXBContext jaxbContext = JAXBContextFactory.createContext(new Class[] {SuperClass.class}, jaxbContextProperties);
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
StringReader superClassXML = new StringReader("<superClass text=''Hello Super Class''/>");
SuperClass superClass = (SuperClass) unmarshaller.unmarshal(superClassXML);
System.out.println(superClass.getText());
StringReader subClassXML = new StringReader("<subClass>Hello Sub Class</subClass>");
SubClass subClass = (SubClass) unmarshaller.unmarshal(subClassXML);
System.out.println(subClass.getText());
}
}
Salida
Hello Super Class
Hello Sub Class
Me gustaría, en el siguiente escenario, como el enlace de java-type name="SubClass"
que se aplicará para establecer el campo de texto en SuperClass. Sin embargo, no lo es. ¿Hay algún problema al anular bindingsA.xml? De acuerdo con la documentación de las reglas de Anulación :
Si se produce el mismo tipo de java en varios archivos, cualquier valor que se establezca en el archivo posterior anulará los valores del archivo anterior.
¿Qué debo hacer para que funcione?
Entrada:
<?xml version="1.0" encoding="UTF-8"?>
<a text="A text">B text</a>
Enlaces A:
<?xml version="1.0"?>
<xml-bindings
xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm"
package-name="test">
<java-types>
<java-type name="SuperClass">
<xml-root-element name="a"/>
<java-attributes>
<xml-element java-attribute="text" xml-path="@text" />
</java-attributes>
</java-type>
</java-types>
</xml-bindings>
Vinculaciones B:
<?xml version="1.0"?>
<xml-bindings
xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm"
package-name="test">
<java-types>
<java-type name="SuperClass" xml-transient="true"></java-type>
<java-type name="SubClass">
<xml-root-element name="a"/>
<java-attributes>
<xml-element java-attribute="text" xml-path="text()" />
</java-attributes>
</java-type>
</java-types>
</xml-bindings>
Clases:
public class SuperClass {
private String text;
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
}
public class SubClass extends SuperClass { }
Manifestación:
Map<String, Object> jaxbContextProperties = new HashMap<String, Object>(1);
List<String> bindings = new LinkedList<String>();
bindings.add("bindingsA.xml");
bindings.add("bindingsB.xml");
jaxbContextProperties.put(JAXBContextProperties.OXM_METADATA_SOURCE, bindings);
JAXBContext jaxbContext = JAXBContextFactory.createContext(new Class[] {SuperClass.class}, jaxbContextProperties);
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
SuperClass superClass = (SuperClass)unmarshaller.unmarshal(new File("input.xml"));
System.out.println(superClass.getText());
Salida:
[EL Warning]: 2013-07-31 16:08:07.771--Ignoring attribute [text] on class [SubClass] as no Property was generated for it.
A text