Notice: This Wiki is now read only and edits are no longer possible. Please see: https://gitlab.eclipse.org/eclipsefdn/helpdesk/-/wikis/Wiki-shutdown-plan for the plan.
Difference between revisions of "EclipseLink/Development/Dynamic/def1"
Line 5: | Line 5: | ||
.source-java5 {padding:4px;border:1px solid black;} | .source-java5 {padding:4px;border:1px solid black;} | ||
</css> | </css> | ||
− | =====Dynamic Persistence===== | + | ===== Dynamic Persistence ===== |
− | + | Dynamic Persistence is defined as the ability to create a persistent entity class and use it within an application without the Java class existing (no .java or .class files). This is typically accomplished by creating a class on-the-fly with a custom ClassLoader that uses a bytecode manipulation library (such as [ASM | http://asm.objectweb.org],[or others |http://www.java-source.net/open-source/bytecode-libraries]). | |
− | + | ||
− | + | Dynamic Persistence is - in essence - a <i>trick</i> with ClassLoaders. EclipseLink's meta-data describes a persistent entity in terms of a <b>Descriptor</b> which owns (one or more) <b>Mappings</b> that represent a class' member fields. The class' info is string-based - for instance in code: | |
− | Dynamic Persistence is in essence a <i>trick</i> with ClassLoaders. EclipseLink's meta-data describes a | + | |
<source lang="java5"> | <source lang="java5"> | ||
RelationalDescriptor addressDescriptor = new RelationalDescriptor(); | RelationalDescriptor addressDescriptor = new RelationalDescriptor(); | ||
Line 15: | Line 14: | ||
addressDescriptor.setJavaClassName("com.foo.bar.Address"); | addressDescriptor.setJavaClassName("com.foo.bar.Address"); | ||
</source> | </source> | ||
+ | or XML: | ||
<source lang="xml"> | <source lang="xml"> | ||
<?xml version="1.0" encoding="UTF-8"?> | <?xml version="1.0" encoding="UTF-8"?> | ||
Line 28: | Line 28: | ||
<alias>address</alias> | <alias>address</alias> | ||
</source> | </source> | ||
− | Because almost any value can be specified for the | + | Because almost any value can be specified for the <class> (within the limits of Java naming requirements), there is the possibility that at runtime the class cannot be found. The trick is to provide a custom ClassLoader that upon detecting that {{com.foo.bar.Address}} does not exist, uses a bytecode manipulation library to <b>create<b> a class that agrees with the meta-data - in terms of the Mappings, their types, etc. |
Revision as of 16:24, 27 August 2009
Dynamic Persistence
Dynamic Persistence is defined as the ability to create a persistent entity class and use it within an application without the Java class existing (no .java or .class files). This is typically accomplished by creating a class on-the-fly with a custom ClassLoader that uses a bytecode manipulation library (such as [ASM | http://asm.objectweb.org],[or others |http://www.java-source.net/open-source/bytecode-libraries]).
Dynamic Persistence is - in essence - a trick with ClassLoaders. EclipseLink's meta-data describes a persistent entity in terms of a Descriptor which owns (one or more) Mappings that represent a class' member fields. The class' info is string-based - for instance in code:
RelationalDescriptor addressDescriptor = new RelationalDescriptor(); addressDescriptor.setAlias("address"); addressDescriptor.setJavaClassName("com.foo.bar.Address");
or XML:
<?xml version="1.0" encoding="UTF-8"?> <object-persistence version="Eclipse Persistence Services - {some version}" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:eclipselink="http://www.eclipse.org/eclipselink/xsds/persistence" > <name>relationships</name> <class-mapping-descriptors> <class-mapping-descriptor xsi:type="xml-class-mapping-descriptor"> <class>com.foo.bar.Address</class> <alias>address</alias>
Because almost any value can be specified for the <class> (within the limits of Java naming requirements), there is the possibility that at runtime the class cannot be found. The trick is to provide a custom ClassLoader that upon detecting that Template:Com.foo.bar.Address does not exist, uses a bytecode manipulation library to create<b> a class that agrees with the meta-data - in terms of the Mappings, their types, etc.