Hibernate Books

All times are UTC - 5 hours [ DST ]



Post new topic Reply to topic  [ 1 post ] 
Author Message
 Post subject: Selbst erstelle Klasse A 2mal nutzen=>Mapping-Fehler GELÖST
PostPosted: Wed May 16, 2012 3:50 pm 
Newbie

Joined: Wed May 16, 2012 3:29 pm
Posts: 1
Ich habe folgende Situation: User sind bei mir nur über ihre Userid identifizierbar. Zwar haben sie auch einen Usernamen, den können sie aber jederzeit ändern.
Möchte nun User A User B eine Nachricht schicken, so gibt er natürlich nur dessen Usernamen ein, dieser muss also umgewandelt werden. Werden die Nachrichten dann später angezeigt, muss auch aus der Absender-ID wieder ein Name gemacht werden. Solche Fälle habe ich an verschiedensten Stellen in meinem Projekt.
Um diese Umwandlung möglichst einfach zu gestalten, habe ich folgende Idee gehabt: Ich möchte mir eine Klasse "User" erstellen, die über 2 Eigenschaften verfügt: "UserId" und "UserName". Dabei sind die get- und set-Accessors so gestaltet, dass die "UserId" beim Abrufen ggf. über den UserName an die Id gelangt, und der UserName (falls er nicht angegeben, aber abgerufen wird) durch die Id geladen werden kann. Dadurch - so meine Idee - kann ich an jeder Stelle beide Daten einfach abrufen. Ist die Eigenschaft nicht gefüllt, wird sie über die andere Eigenschaft aus der DB geladen.

Um das zu realisieren, habe ich folgende 2 Klassen erstellt:
User-Class
Code:
public class User
    {
        private Guid _id;
        public virtual Guid Id
        {
            get
            {
               //Logik zum eventuellen Laden der Id mit Hilfe des Namens über die DB
            }
            set
            {
               _id = value;
            }
        }

        private string _name;
        public virtual string Name
        {
            get
            {
                //Logik zum eventuellen Laden des Namens mit Hilfe der Id über die DB
            }
            set
            {
                _name = value;
            }
        }
    }


Message-Class
Code:
public class Message
    {
        public virtual Guid Id { get; set; }
        public virtual User sender { get; set; }
        public virtual User receiver { get; set; }
        public virtual string subject { get; set; }
        public virtual string text { get; set; }
    }


Message-Mapping
Code:
public class MessageMap : ClassMap<Message>, IMappedEntity
    {
        public MessageMap()
        {
            Id(x => x.Id);
            Map(x => x.sender.Id);
            Map(x => x.receiver.Id);
            Map(x => x.subject);
            Map(x => x.text);
        }
    }

Im Mapping der Message-Class speicher ich nur die Id des Users, da sich der Name ja eh jederzeit ändern kann.

Starte ich mein Projekt dann aber, erscheint folgende Meldung: Tried to add property 'Id' when already added.
Kommentiere ich alles was mit den receiver zu tun hat aus, und verwende meine Klasse User somit nur 1x, klappt es.

Was muss ich machen, damit ich meine selbst erstellte Klasse auch merhfach nutzen kann?

Edit
Ich habe Map(x => x.sender.Id); nun durch
Code:
Component(
                x => x.sender,
                userId =>
                {
                    userId.Map(x => x.Id, "senderId");
                }
            );
ersetzt (receiver.Id ebenso), nun läuft es!


Last edited by MoneyMaker02 on Fri May 18, 2012 12:38 pm, edited 1 time in total.

Top
 Profile  
 
Display posts from previous:  Sort by  
Post new topic Reply to topic  [ 1 post ] 

All times are UTC - 5 hours [ DST ]


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum

Search for:
© Copyright 2014, Red Hat Inc. All rights reserved. JBoss and Hibernate are registered trademarks and servicemarks of Red Hat, Inc.