Avatar billede fanatic Nybegynder
02. juli 2009 - 12:43 Der er 6 kommentarer og
1 løsning

Mapping af to entitets-objekter

Hej eksperter.

Findes der en smart måde/værktøj hvorpå jeg kan "mappe" et entitets-objekt til et andet?

Dvs. jeg har et objekt med nogle attributter. Et andet system skal bruge disse informationer men vil have at objektet og attributterne hedder noget andet samt at værdierne evt. skal mappes over i andre attributter.

Derudover kan der løbende forekomme ændringer til hvorledes denne mapning skal fungere så jeg forestiller mig evt. en XML fil hvor man kan skrive hvilke attributter i det ene objekt, der skal mappes til andre attributter i det andet objekt.
Avatar billede fanatic Nybegynder
02. juli 2009 - 12:51 #1
eksempelvis vil jeg gerne undgå denne form for hard code:

void transformClass(Paper p, Report r)
{
    p.setId( r.getNr );
}

Jeg vil også gerne dynamisk kunne oprette nye attributter i klasserne hvis der er behov for det.


Kan det mon lade sig gøre??
Avatar billede fanatic Nybegynder
02. juli 2009 - 12:54 #2
p.setId( r.getNr ); ville så svare til følgende i en config XML-fil:

Page.setId = Report.getNr
Avatar billede arne_v Ekspert
02. juli 2009 - 14:43 #3
Nu er det ikke indlysende for mig hvorfor det er bedre at have assignment i en XML config end i en Java source fil.

Men anyway:
- jeg kender ikke noget faerdigt tool til dette
- men det ville vaere relativt nemt at lave en af:
    - utility som compiler XML til Java source som saa compiles normalt
    - kode som runtime laeser XML og dynamisk genererer kode der laver konverteringen
Avatar billede fanatic Nybegynder
03. juli 2009 - 08:55 #4
Det med at bruge en tekstfil (xml) var blot tænkt således at man nemt kan ændre mapningen.

Men hvordan ville du lave det? Vil du skrive nogle flere punkter til det?

Problemstillingen var: Jeg har har et entity-objekt, værdierne derfra ønsker jeg mappet over i et andet objekt. Det kan dog sagtens være at det andet objekt ændrer struktur. Derfor må jeg ind og ændre klassen og re-kompilerer hver gang det sker. Kunne jeg mon blot skrive hvilke attributter der skal mappes i en tekstfil således at jeg ikke behøver at ændre sourcekoden direkte men blot denne tekstfil og derefter re-kompilerer?
Avatar billede fanatic Nybegynder
09. juli 2009 - 11:01 #5
hej arne. Skriver du lige et svar så vi kan få lukket denne?
Avatar billede arne_v Ekspert
10. juli 2009 - 02:12 #6
Jeg ville faktisk lige have lavet et eksempel !

Her kommer det.

Mapping:

c = b
d = a

(XML var nok bedre, men det var hurtigere med enproperties fil)

Kode:

import java.beans.IntrospectionException;
import java.beans.PropertyDescriptor;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Properties;
import java.util.Map.Entry;

public class ObjMap {
    public static void map(Object o1, Object o2, Properties p) throws IntrospectionException, IllegalArgumentException, IllegalAccessException, InvocationTargetException {
        for(Entry e : p.entrySet()) {
            Method put = (new PropertyDescriptor((String) e.getKey(), o2.getClass())).getWriteMethod();
            Method get = (new PropertyDescriptor((String) e.getValue(), o1.getClass())).getReadMethod();
            put.invoke(o2, get.invoke(o1));
        }
    }
    public static void main(String[] args) throws Exception {
        Properties p = new Properties();
        p.load(new FileInputStream("C:\\map.properties"));
        Foo o1 = new Foo();
        o1.setA(123);
        o1.setB(456);
        Bar o2 = new Bar();
        map(o1, o2, p);
        System.out.println(o2.getC() + " " + o2.getD());
    }
}

class Foo {
    private int a;
    private int b;
    public int getA() {
        return a;
    }
    public void setA(int a) {
        this.a = a;
    }
    public int getB() {
        return b;
    }
    public void setB(int b) {
        this.b = b;
    }
}

class Bar {
    private int c;
    private int d;
    public int getC() {
        return c;
    }
    public void setC(int c) {
        this.c = c;
    }
    public int getD() {
        return d;
    }
    public void setD(int d) {
        this.d = d;
    }
}

(map metoden kan optimeres lidt da den reflecterer ved hver eneste kald)

Men ellers bør koden være relativ nem at overskue.
Avatar billede arne_v Ekspert
10. juli 2009 - 02:12 #7
og et svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester