Type-Mapping von DB-Type zu ObjectType via Hibernate

Status
Nicht offen für weitere Antworten.

Foermchen82

Top Contributor
Hallo zusammen.

Ich habe folgende Situation:

Ich lade und speichere ein Object via Hibernate in eine Datenbank.
Jetzt habe ich da ein Attribut, ich nenn es jetzt mal "mappingAttribut", was in der Datenbank einen bestimmten Type hat. Im object jdedoch soll es in einem anderen Typ, nämlich in einem eigenen Object abgebildet werde.
Beispiel: in der Datenbank ist es String und in meinem Object soll es z.b. den TypABC haben.
Den Typ ABC kann ich Problem los aus dem String herstellen (z.b. ein Object, was den Stringinhalt, die Länge und das Wort rückwärts haben)

Hibernate füllt ja normalerweise die Properties via Getter und Setter methoden. Die sollten aber schon den DB-Typ bzw. ein Äquivalent haben. Das Object jedoch soll für das "mappingAttribut" den Typ ABC haben. Wie kann ich das also am einfachsten herstellen?
 

Foermchen82

Top Contributor
Danke für die Antwort.
Sowas wie USerType hab ich gesucht.

Jedoch stehe ich jetzt vor dem Nächsten Problem:

Mein Object referenziert auf ein weiteres, welches auch in der DB liegt. Soweit so gut. das kann man ja via one-to-one machen.

Jedoch benötigt mein "mappingAttribut" zum korrektem mappen des Typs informationen von dem Object auf welches in der assoziation refernziert wird.

Die methode:
Code:
public Object nullSafeGet(ResultSet resultSet, String[] names, Object owner)
			throws HibernateException, SQLException {
}

aus dem UserType-Interface jedoch bietet mir keine Möglichkeiten auf andere Properties meines Objektes zuzugreifen. Was kann ich da tun??

Danke im voraus.
 

Foermchen82

Top Contributor
In meiner Frage liegt zum Teil die Antwort. Die Methoden-Signatur, die ich gepostet haben gibt mir ja das owner-Objekt mit. Das ist jedoch noch nicht gefüllt. Zum zeitpunkt an dem das Mapping mit dem UserType durchgeführt wird.

Wozu ist also das owner-Objekt zu gerbrauchen, wenn es doch gar nicht vollständig ist. Kann ich das irgenwie so konfigurieren, das erst alle Properties geladen werden und erst dann das was ich mappen will?

Danke im Voraus!!
 
S

SlaterB

Gast
ich kann da nicht weiterhelfen,
hab mal bei einem UserType aus meinem Programm geschaut,
nicht von mir geschrieben, da ist der Owner immer vorhanden

einn UserType mit zwei int-Werten

Mapping:
Code:
		<property name="z" type="package.ZType">
			<column name="Unit" precision="12" scale="0" />
			<column name="Count" precision="12" scale="0" />
		</property>
die Klasse
Code:
public class ZUserType implements CompositeUserType
{
    
    public String[] getPropertyNames()
    {
        return new String[]{"unit", "count"};
    }

    public Type[] getPropertyTypes()
    {
        return new Type[]{Hibernate.INTEGER, Hibernate.INTEGER};
    }

    public Object getPropertyValue(Object component, int property)
        throws HibernateException
    {
        final Z z = (Z)component;

        return property == 0 ? (Object)z.getUnit() : (Object)z.getCount();

    }

    public void setPropertyValue(Object component, int property, Object value)
        throws HibernateException
    {
        final Z z = (Z)component;

        if (property == 0)
            z.setUnit((Integer)value);
        else
            z.setCount((Integer)value);
    }

    public Class returnedClass()
    {
        return Z.class;
    }

    public boolean equals(Object x, Object y)
        throws HibernateException
    {
        if (x == y) return true;
        if (x == null || y == null) return false;

        final Z zX = (Z)x;
        final Z zY = (Z)y;

        return (zX.getUnit() == zY.getUnit()) &&
               (zX.getCount() == zY.getCount());
    }

    public int hashCode(Object x)
        throws HibernateException
    {
        final Z z = (Z)x;
        return z.getCount() * 100 + z.getUnit();
    }

    public Object nullSafeGet(ResultSet rs, String[] names, SessionImplementor session, Object owner)
        throws HibernateException, SQLException
    {
        System.out.println("owner: "+owner);
        final Integer unit = (Integer)Hibernate.INTEGER.nullSafeGet(rs, names[0]);

        if (unit == null) 
            return null;

        final Integer count = (Integer)Hibernate.INTEGER.nullSafeGet(rs, names[1]);
        return new Z(unit, count);

    }

    public void nullSafeSet(PreparedStatement st, Object value, int index,
                            SessionImplementor session)
        throws HibernateException, SQLException
    {
        final Z z = (Z)value;

        final Integer unit;
        final Integer count;

        if (z == null)
        {
            unit = null;
            count = null;
        }
        else
        {
            unit = z.getUnit();
            count = z.getCount();
        }
        
        Hibernate.INTEGER.nullSafeSet(st, unit, index);
        Hibernate.INTEGER.nullSafeSet(st, count, index + 1);
    }

    public Object deepCopy(Object value)
        throws HibernateException
    {
        if (value == null)
            return null;
        
        final Z z = (Z)value;
        return new Z(z.getUnit(), z.getCount());
    }

    public boolean isMutable()
    {
        return true;
    }

    public Serializable disassemble(Object value, SessionImplementor session)
        throws HibernateException
    {
        return (Serializable)deepCopy(value);
    }

    public Object assemble(Serializable cached, SessionImplementor session, Object owner)
        throws HibernateException
    {
        return deepCopy(cached);
    }

    public Object replace(Object original, Object target, SessionImplementor session, Object owner)
        throws HibernateException
    {
        return deepCopy(original); //TODO: improve
    }
}
System.out.println("owner: "+owner);
aus Zeile 89 liefert nie null,
zumindest bei einfachem Test, paar Objekte aus DB lesen, nix angelegt usw.
 
S

SlaterB

Gast
ok, das kann ich auch bestätigen bis auf den Primärschlüssel,

sonst aber nix mehr beitragen
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
I Hibernate Predicate mit IN Clause "Unaware how to convert value to requested type" Datenbankprogrammierung 0
P MySQL JPA / MySQL - Fehler bei type=innoDB Datenbankprogrammierung 8
OnDemand Column char type, wie befüllen? Datenbankprogrammierung 2
T IllegalArgumentException: Person[ id=null ] is not a known entity type.??? Datenbankprogrammierung 0
S Oracle PL/SQL Procedure mit Type Rückgabe Datenbankprogrammierung 1
P GWT Applikation-The method forName(String) is undefined for the type Class Datenbankprogrammierung 10
ARadauer Could not determine type for: java.util.List, for columns Datenbankprogrammierung 3
E ERROR: argument of JOIN/ON must be type boolean? Datenbankprogrammierung 2
F Mapping einer SQL Abfrage in eine Klasse Datenbankprogrammierung 4
C Mapping mit Annotations von 2 Tabellen Datenbankprogrammierung 22
F Mapping SQL mit Klasse Datenbankprogrammierung 7
T JPA Mapping Enum (hibernate 5) Datenbankprogrammierung 1
N Enums und passendes Mapping Datenbankprogrammierung 6
G OR Mapping Datenbankprogrammierung 2
S Spaltennamen "Mapping" Datenbankprogrammierung 5
T MySQL Hibernate Mapping Datenbankprogrammierung 5
V Frage zu Hibernate-Mapping Datenbankprogrammierung 11
T Hibernate: Reverse Enigneering - kein Mapping von Beziehungen Datenbankprogrammierung 8
Eldorado Hibernate Mapping Datenbankprogrammierung 5
B Hibernate Mapping Problem Datenbankprogrammierung 3
S Hibernate Mapping Datenbankprogrammierung 3
lumo HIbernate: Could not read mapping document Datenbankprogrammierung 9
klattiator Aufklärung über OR-Mapping Datenbankprogrammierung 7
N OR-Mapping (Hibernate) versus JDBC Datenbankprogrammierung 5
M JPA Annotations @JoinTable oder eigenes Mapping Datenbankprogrammierung 13
S hibernate-Mapping schlägt fehl Datenbankprogrammierung 8
F Hibernate Mapping problem Datenbankprogrammierung 2
G OR Mapping Datenbankprogrammierung 2
Y Hibernate - Problem bei Mapping Datenbankprogrammierung 7
Y Hibernate - Mapping der Beziehung zwischen 2 Tabellen Datenbankprogrammierung 2
G [Hibernate] Map von Dates Mapping mit Annotations Datenbankprogrammierung 6
G Hibernate Mapping für Interface Datenbankprogrammierung 3
S [Hibernate] Map in Map - Wie sieht Mapping Datei aus? Datenbankprogrammierung 10
C Hibernate-Mapping bei mehreren FK´s auf die selbe Tabelle Datenbankprogrammierung 12

Ähnliche Java Themen

Neue Themen


Oben