Announcement

Collapse
No announcement yet.

@OneToMany ohne Fremdschlüssel

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • @OneToMany ohne Fremdschlüssel

    Hallo Leute,
    ich habe ien problem @OneToMany einzusetzen. ich habe folgende Tabellenstruktur.

    Kunde
    ----------
    id
    .....
    -----

    Mitarbeiter
    ----------
    id
    .....
    -----

    KontaktInfo (also für telefonnummer oder EMail adresse)
    -----------
    id
    stammdatenart(kunde oder mitarbeiter)
    stammdaten_id(id von kunde bzw. mitarbeiter)
    .....
    -----

    Jeder Kunde hat mehrere kontaktinfo und auch kontaktinfo von mitarbeiter befinden sich in gleiche Tabelle. man unterscheidet es durc satmmdatenart.
    zwichen Kunde und kontaktInfo befindet keine Fremdschlüssel.
    Wie kann ich jetzt diese beziehung mit @OneToMany darstellen. Ist es möglich, ein Bedingung mit OneToMany zu benutzen?

    viele Grüße.

  • #2
    Kunde -> Kontaktinfo = OneToMany
    Mitarbeiter -> Kontaktinfo = OneToMany

    Jeweils in den entsprechenden Klassen Kunde und Mitarbeiter. Wo wird da eine Bedingung benötigt?
    Christian

    Comment


    • #3
      Guck mal die Struktur von der Tabelle KontaktInfo.
      diese Tabelle nicht nur für Kunde , auch für Mitarbeiter.
      Wenn man so einfach @OneToMany schreibt, bekommt man die kontaktInfos von Kunde und Mitarbeiter, die gleicher Id bezitzen.

      In der Tabelle KontaktInfos befindet solche Daten;

      id stammdatenart stammdatenId kontaktInfo
      --- ------------------- ------------------- ---------------
      1 KUNDE 10 123/124578
      2 KUNDE 11 123/456987
      3 MITARBEITER 10 856/789654
      4 MITARBEITER 10 [email protected]

      bei diesem Fall in Kunde obejkt mit dem Id=10 krigt man ein liste von KontaktInfos mit den Id 1-3-4

      Deswegen bracht man irgend einer Weise eine Bedingung zu definieren, dass man auch Stammdatenart mit schreiben kann

      Comment


      • #4
        Du kannst mit JoinColumn die "beteiligte" Column angeben. Das nützt dir hier allerdings nichts. Eine Bedingung kannst du m.E. nicht vorgeben.
        Christian

        Comment


        • #5
          Hallo fuzuli001,
          mach in Deinem Model zwei Klassen (KundeKontakt, MitarbeiterKontakt), die beide von KontaktInfo ableiten. Benutze dann eine Collection KundeKontakt für Kunde und eine Collection MitarbeiterKontakt für Mitarbeiter. Beim Mapping nutzt Du dann für das Inheritance Mapping Table per class (http://docs.jboss.org/hibernate/stab...-tableperclass).
          Deine Spalte Stammdatenart wäre dann der Discriminator. So kriegst Du auf jeden Fall Deine Tabellenstruktur gemappt, ohne sie zu ändern.
          Gruß ngomo
          http://www.winfonet.eu

          Comment


          • #6
            Hallo ngomo,
            deine idee ist ganz gut und funktioniert. aber habe ein problem.
            meine implementierung sieht so aus;

            Code:
            @Entity
            @Table(name = "kontakt_infos")
            @Inheritance(strategy= InheritanceType.SINGLE_TABLE)
            @DiscriminatorColumn(name="stammdatenart", discriminatorType = DiscriminatorType.STRING)
            public abstract class KontaktInfo {
            
                    @Id
                    Long id;
                    .....
            }
            
            @Entity
            @DiscriminatorValue("KUNDE")
            public class KundeKontaktInfo extends KontaktInfo{
            
                 @JoinColumn(name="stammdaten_id",referencedColumnName="kunde_id")
                 @ManyToOne(fetch = FetchType.LAZY)
                 private Kunde kunde;	
                 ......
            }
            
            @Entity
            @Table(name = "sd_kunden")
            public class Kunde {
                 @Id
                 ...
                 @OneToMany(mappedBy="kunde", fetch = FetchType.LAZY)
                 private List<SdKundeKontaktInfo> kontaktInfoList;	
            }
            Also wenn ich ein neue Kontakt für Kunde erstellen will,
            Code:
            KundeKontaktInfo kont = new KundeKontaktInfo();
            			kont.setKunde(kunde);
            			entityManager.persist(kont);
            funktioniert ganz gut. DiscriminatorColumn wird automatisch mit dem wert KUNDE gefüllt.

            Code:
            List<KundeKontaktInfo> kontaktList = entityManager.
                                   createQuery("select k from KundeKontaktInfo k where k.kunde= :kunde").
                                   setParameter("kunde",kunde).
                                   getResultList();
            liefert richtige ergebnisse.

            Aber wenn ich kunde.getKontaktInfoList schreibe, bekomme ich falsche ergebnisse. Also alle ergebnisse mit bestimmten id, ohne DiscriminatorColumn zu beachten. z.B alle ergebnisse mit denen stammdaten_id=3 sind, egal ob die Mirarbeiter oder Kunde sind. Also die beziehung von Kunde seite funktioniert nicht.

            Comment


            • #7
              Hallo fuzuli001,

              ich glaub, irgendwo in Deinen Mapping-Annotations ist noch ein Fehler. So auf den ersten Blick sehe ich den aber nicht. Ich baue das heute Abend zu Hause mal nach. Wird aber recht spät werden.

              Gruß ngomo
              http://www.winfonet.eu

              Comment

              Working...
              X