Skip to main content

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.

Jump to: navigation, search

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 =====
<onlyinclude>
+
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]).
This refers to the ability within an application to define a persistent entity class and use it within the application without the entity class existing (no.java or .class files). This is accomplished by creating a class on the fly using byte-codes.
+
 
</onlyinclude>
+
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 Java class in terms of a <b>Descriptor</b> which owns one of more <b>Mappings</b> that represent that class' member fields. The class info is string-based - i.e. in code or XML:
+
 
<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 name of a Java 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 such as [ASM | http://asm.objectweb.org] ([or others |http://www.java-source.net/open-source/bytecode-libraries]) to *_create_* a class that satisfies the meta-data in terms of the number of Mappings.
+
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.

Back to the top