# Relationship stimmt irgendwo nicht



## puck (22. Jan 2007)

Hallo zusammen,
ich habe in meinem kleinen EJB-Projekt ein Problem mit den Relationships. Und zwar habe ich eine ZugansdatenBean die mehrere sogenannte Tan-Beans hat. Also eine 1 zu N-Beziehung. Eine Zugansdatenbean->mehrer TanBeans.

Das ganze habe ich folgendermaßen aufgebaut:


```
package org.chaos.zugangsdaten;


@Entity
@Table(name="ZUGANGSDATEN")
public class ZugangsdatenBean implements Serializable
{
  private static final long serialVersionUID = 1L;
  private String passwort;
  private String login_Name;
  private String pin;
  private Collection <TanBean> tans = new ArrayList<TanBean>();
  
  
  public ZugangsdatenBean() {}
  
  public ZugangsdatenBean( String passwort, String login_name, String pin )
  {
    this.passwort = passwort;
    this.login_Name = login_name;
    this.pin = pin;
  }
  
  @Column (name="PASSWORT")
  public String getpassword()
  {
    return this.passwort;
  }
  
  public void setpassword(String mypassword)
  {
    this.passwort = mypassword;
  }
  
  @Column (name="LOGIN")
  public String getlogin_name()
  {
    return this.login_Name;
  }
  
  public void setlogin_name(String mylogin)
  {
    this.login_Name = mylogin;
  }
  
  @Id
  @Column (name="PIN")
  public String getpin()
  {
    return this.pin;
  }
  
  public void setpin(String mypin)
  {
    this.pin = mypin;
  }
  
  
  @OneToMany (mappedBy="zugangsdatenbean",cascade=CascadeType.ALL, fetch=FetchType.EAGER)
  public Collection <TanBean> getAllTans()
  {
    return this.tans;
  }
  
  public void setTans(Collection <TanBean> mytan)
  {
    this.tans = mytan;
  }
  
  
}
```

Und nun die TanBean:

```
@Entity
@Table(name="TAN")
public class TanBean implements Serializable
{
  private static final long serialVersionUID = 1L;
  private String nummer;
  private ZugangsdatenBean zugang = null;
  
  public TanBean (String mynummer)
  {
    this.nummer = mynummer;
  }
  
  @Id
  @Column (name="TNUMMER")
  @GeneratedValue () 
  public String getNummer()
  {
    return this.nummer;
  }
  
  public void setNummer(String mynummer)
  {
     this.nummer = mynummer; 
  }
  
  @ManyToOne
  @JoinColumn(name="ZUGANGSDATEN")
  public ZugangsdatenBean getZugangsDaten()
  {
    return this.zugang;
  }
  
  public void setZugangsDaten(ZugangsdatenBean myzugang)
  {
    this.zugang = myzugang;
  }
  
  

}
```

Die Fehlermeldung sieht ist diese:

```
124 WARN  [ServiceController] Problem starting service persistence.units:ear=TestBank.ear,jar=TestBankEJB.jar,unitName=chaos
org.hibernate.AnnotationException: mappedBy reference an unknown target entity property: org.chaos.tans.TanBean.zugangsdatenbean in org.chaos.zugangsdaten.ZugangsdatenBean.allTans
```

Was habe ich übersehen?

Gruss Christian


----------



## KSG9|sebastian (22. Jan 2007)

Du solltest tunlichst auf Groß/Kleinschreibung achten!
Evtl. musst du das Package noch mit angeben.
Deine Getter/Setter sollten auch den Konventionen entsprechen.
Richtig:

```
private String text;
public void setText(String text){
  this.text = text;
}
public String getText(){
  return text;
}
```
Falsch:

```
private String text;
public void settext(String text){
  this.text = text;
}
public String gettext(){
  return text;
}
```

Hibernate macht sonst nur Probleme.
Lass doch einfach Getter und Setter erstellen (Eclipse: Rechtklick -> Source -> Generate Getters and Setters)


----------



## puck (22. Jan 2007)

Ah ja ich habe das mit den Methodennamen jetzt auch rausgefunden. Die Regeln sind mir aber noch nicht ganz klar. Ich finde es auch ein bischen Komisch, wenn man durch die Wahl der Variablennamen in der Wahl der Methoden eingeschränkt wird. Obwohl es durchaus Sinn macht.

Mit dem Eclipse Hilfsmenü kann ich nur die Getter und Setter-Methoden für die lokalen Attribute/Variablen erstellen lassen, aber keine Fremdschlüssel. Naja auf jeden Fall wurden mir nur die zur Auswahl angegeben. 

Kann mir jemand noch sagen wo genau diese Regel für die Groß/Kleinschreibung dokumentiert ist? Ich habe die neuste Auflage von Enterprise JavaBeans 3.0, da sollte es doch drin stehen, aber wo genau?

Ach ja mein Problem war folgendes: 
Ich habe in der Tanbean die ja das N-Ende der Relationship bildet die Methoden zum erhalt der ZugangsdatenBean so implemetiert:

```
@ManyToOne
  @JoinColumn(name="ZUGANGSDATEN")
  public ZugangsdatenBean getZugangsDaten()
  {
    return this.zugang;
  }
  
  public void setZugangsDaten(ZugangsdatenBean myzugang)
  {
    this.zugang = myzugang;
  }
```

Dann muss ich auch in der Zugangsdatenbean in der Anotation folgendes schreiben:

```
@OneToMany (mappedBy="zugangsDaten",cascade=CascadeType.ALL, fetch=FetchType.EAGER)
```
auf das 'mappedBy' kommt es an. Die Methode oben hies "getZugangsDaten", nimmt man das 'get' weg, macht den ersten Buchstaben klein, verändert sonst jedoch nichts, hat man das Argument für 'mappedBy'

Jo, das wars...
Ende gut alles gut ... mein SC Freiburg hat heute Abend gewonnen, bin zufrieden... gute Nacht   

Gruss Christian


----------

