# mappedBy reference an unknown target entity property



## FT77 (24. Jul 2007)

Hallo, 

ich habe das Problem bereits unter Anfänger gepostet. Da es sich aber um eine spezielle Hibernatefrage handelt, denke ich, dass es hier besser aufgehoben ist.

Ich lerne gerade den Einsatz von Hibernate. Ich habe bereits erfolgreich eine NM Beziehung zwischen Entitäten realisiert. Hierfür setzte ich *.hbm.xml mappingfiles ein. Nun möchte ich das gleiche Ergebniss mit Annotationen erreichen. Das klappt leider nicht. Zu erst die Fehlermeldung und dann meine Klassen und xml's: 




> Initial SessionFactory creation failed.org.hibernate.AnnotationException: mappedBy reference an unknown target entity property: domain.Termin.person in domain.Person.termine
> Exception in thread "main" java.lang.ExceptionInInitializerError
> at services.HibernateUtil.sessionFactory(HibernateUtil.java:39)
> at services.HibernateUtil.getSessionFactory(HibernateUtil.java:20)
> ...






```
package domain; 

import java.util.LinkedList; 
import java.util.List; 
import domain.Termin; 
import javax.persistence.Entity; 
import javax.persistence.GeneratedValue; 
import javax.persistence.GenerationType; 
import javax.persistence.Id; 
import javax.persistence.ManyToMany; 
import javax.persistence.Table; 


@Entity 
@Table(name = "PERSON") 
public class Person { 
   private long id; 
   private String vorname; 
   private String nachname; 
   private List<Termin> termine=new LinkedList<Termin>(); 
    
   public Person() { 
   } 
   @Id @GeneratedValue(strategy=GenerationType.AUTO) 
   public long getId() { 
      return id; 
   } 
   public void setId(long id) { 
      this.id = id; 
   } 
   public String getNachname() { 
      return nachname; 
   } 
   public void setNachname(String nachname) { 
      this.nachname = nachname; 
   } 
   public String getVorname() { 
      return vorname; 
   } 
   public void setVorname(String vorname) { 
      this.vorname = vorname; 
   } 
    
   public void addTermin(Termin termin){ 
      termine.add(termin); 
   } 
   @ManyToMany(mappedBy="person") 
   public List<Termin> getTermine() { 
      return termine; 
   } 
   public void setTermine(List<Termin> termine) { 
      this.termine = termine; 
   } 
    
}
```


```
package domain; 

import java.util.ArrayList; 
import java.util.List; 

import javax.persistence.Entity; 
import javax.persistence.GeneratedValue; 
import javax.persistence.GenerationType; 
import javax.persistence.Id; 
import javax.persistence.ManyToMany; 
import javax.persistence.Table; 


@Entity 
@Table(name = "TERMIN") 
public class Termin { 
   private long id; 
   private String titel; 
   private Person eigentuemer; 
   private List<Person> teilnehmer= new ArrayList<Person>(); 
    
   public void addTeilnehmer(Person person){ 
      teilnehmer.add(person); 
   } 
   @ManyToMany 
   public List<Person> getTeilnehmer() { 
      return teilnehmer; 
   } 
   public void setTeilnehmer(List<Person> teilnehmer) { 
      this.teilnehmer = teilnehmer; 
   } 
   public Termin() { 
       
   } 
   @Id @GeneratedValue(strategy=GenerationType.AUTO) 
   public long getId() { 
      return id; 
   } 
   public void setId(long id) { 
      this.id = id; 
   } 
   public String getTitel() { 
      return titel; 
   } 
   public void setTitel(String titel) { 
      this.titel = titel; 
   } 
   public Person getEigentuemer() { 
      return eigentuemer; 
   } 
   public void setEigentuemer(Person eigentuemer) { 
      this.eigentuemer = eigentuemer; 
   } 
    
}
```


```
package test; 

import org.hibernate.Session; 
import org.hibernate.SessionFactory; 
import org.hibernate.Transaction; 
import org.hibernate.cfg.Configuration; 
import org.hibernate.tool.hbm2ddl.SchemaExport; 

import services.HibernateUtil; 
import domain.Person; 
import domain.Termin; 

public class Test { 
    
    
    
   public static void main(String[] args) { 
      Session session = null; 
      HibernateUtil.setRecreateDB(true); 
      session = HibernateUtil.getSessionFactory().getCurrentSession(); 
       
       
      /*      Person person1 =new Person(); 
      person1.setNachname("P1"); 
       
      Transaction transaction = session.beginTransaction(); 
      session.save(person1); 
      transaction.commit(); 
       
       
      Person person2 =new Person(); 
      person2.setNachname("P2"); 
      session = HibernateUtil.getSessionFactory().getCurrentSession(); 
      transaction = session.beginTransaction(); 
      session.save(person2); 
      transaction.commit(); 

       
       
      Termin termin1 =new Termin(); 
      termin1.setTitel("T1"); 
      termin1.setEigentuemer(person1); 
      termin1.addTeilnehmer(person1); 
      termin1.addTeilnehmer(person2); 
      session = HibernateUtil.getSessionFactory().getCurrentSession(); 
      transaction = session.beginTransaction(); 
      session.save(termin1); 
      transaction.commit(); 

       
   Termin termin2 =new Termin(); 
      termin2.setTitel("t2"); 
      termin2.setEigentuemer(person1); 
      termin2.addTeilnehmer(person1); 
      termin2.addTeilnehmer(person2); 
       
      transaction = session.beginTransaction(); 
      session.save(termin2); 
      transaction.commit(); 
      session.close(); 
      */ 
       
       

   } 
}
```




```
package services; 

import org.hibernate.SessionFactory; 
import org.hibernate.cfg.AnnotationConfiguration; 


import domain.Person; 
import domain.Termin; 

public class HibernateUtil { 

   private static boolean recreateDB = false; 
    
   public static void setRecreateDB(boolean recreateDB) { 
      HibernateUtil.recreateDB = recreateDB; 
   } 
    
   public static SessionFactory getSessionFactory() { 
      if (sessionFactory == null) { 
         sessionFactory = sessionFactory("hibernate.cfg.xml"); 
      } 
      return sessionFactory; 
   } 
    
   private static SessionFactory sessionFactory = null; 
    
   private static SessionFactory sessionFactory(String configurationFileName) { 
      try { 
         AnnotationConfiguration annotationConfiguration = 
            new AnnotationConfiguration() 
            .addAnnotatedClass(Person.class) 
            .addAnnotatedClass(Termin.class); 
          
         if (recreateDB) annotationConfiguration.setProperty("hibernate.hbm2ddl.auto", "create"); 
         annotationConfiguration.configure(); 
         return annotationConfiguration.buildSessionFactory(); 
      } catch (Throwable ex){ 
         System.err.println("Initial SessionFactory creation failed." + ex); 
         throw new ExceptionInInitializerError(ex); 
      } 
   } 
    
}
```


```
< 
?xml version="1.0" encoding="utf-8"?> 
<!DOCTYPE hibernate-configuration 
    PUBLIC "-//Hibernate/Hibernate Configuration DTD//EN" 
    "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> 

<hibernate-configuration> 
    <session-factory > 
      <property name="hibernate.connection.driver_class">org.gjt.mm.mysql.Driver</property> 
        <property name="hibernate.connection.password">application</property> 
        <property name="hibernate.connection.url">jdbc:mysql://localhost/test</property> 
        <property name="hibernate.connection.username">application</property> 
        <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> 
       <property name="current_session_context_class">thread</property> 
      <property name="hibernate.show_sql">true</property> 
    </session-factory> 
</hibernate-configuration>
```


Vielen Dank für eure Hilfe 

Felix


----------



## Guest (24. Jul 2007)

Ich denke der Fehler liegt in dem mappedBy. Du gibst dort "person" an. D.h. das Hibernate in der Klasse Termin nach dem Attribut "person" sucht (bzw. nach einem entsprechenden getter/setter).

Deine List in der Klasse Termin heißt aber "teilnehmer". Es müsste also funktionieren, wenn du mappedBy="teilnehmer"
statt mappedBy="person" verwendest


----------



## FT77 (24. Jul 2007)

Hallo danke für deinen Tip. Klappt leider auch nicht. Erhalte nachstehende Fehlermeldung. Anbei auch die von mir geänderten Klassen:


```
package domain;

import java.util.LinkedList;
import java.util.List;
import domain.Termin;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import javax.persistence.Table;


@Entity
@Table(name = "PERSON")
public class Person {
	private long id;
	private String vorname;
	private String nachname;
	private List<Termin> termine=new LinkedList<Termin>();
	
	public Person() {
	}
	@Id @GeneratedValue(strategy=GenerationType.AUTO)
	public long getId() {
		return id;
	}
	public void setId(long id) {
		this.id = id;
	}
	public String getNachname() {
		return nachname;
	}
	public void setNachname(String nachname) {
		this.nachname = nachname;
	}
	public String getVorname() {
		return vorname;
	}
	public void setVorname(String vorname) {
		this.vorname = vorname;
	}
	
	public void addTermin(Termin termin){
		termine.add(termin);
	}
	@ManyToMany(mappedBy="teilnehmer")
	public List<Termin> getTermine() {
		return termine;
	}
	public void setTermine(List<Termin> termine) {
		this.termine = termine;
	}
	
}
```


```
package domain;

import java.util.ArrayList;
import java.util.List;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import javax.persistence.Table;


@Entity
@Table(name = "TERMIN")
public class Termin {
	private long id;
	private String titel;
	private Person eigentuemer;
	private List<Person> teilnehmer= new ArrayList<Person>();
	
	public void addTeilnehmer(Person person){
		teilnehmer.add(person);
	}
	@ManyToMany
	public List<Person> getTeilnehmer() {
		return teilnehmer;
	}
	public void setTeilnehmer(List<Person> teilnehmer) {
		this.teilnehmer = teilnehmer;
	}
	public Termin() {
		
	}
	@Id @GeneratedValue(strategy=GenerationType.AUTO)
	public long getId() {
		return id;
	}
	public void setId(long id) {
		this.id = id;
	}
	public String getTitel() {
		return titel;
	}
	public void setTitel(String titel) {
		this.titel = titel;
	}
	public Person getEigentuemer() {
		return eigentuemer;
	}
	public void setEigentuemer(Person eigentuemer) {
		this.eigentuemer = eigentuemer;
	}
	
}
```



> Exception in thread "main" java.lang.ExceptionInInitializerError
> at services.HibernateUtil.sessionFactory(HibernateUtil.java:39)
> at services.HibernateUtil.getSessionFactory(HibernateUtil.java:20)
> at test.Test.main(Test.java:20)
> ...


[/code]


----------



## Guest (25. Jul 2007)

Hi, es kann sein, dass du noch zusätzlich die @JoinTable Annotation verwenden musst.

www.hibernate.org/hib_docs/ejb3-api/javax/persistence/ManyToMany.html
www.j3ltd.com/articles/ejbrels/EJBRelationships.htm


----------



## FT77 (25. Jul 2007)

Ich habs,


ich habe Termin#getEigentuemer() nicht gemappt. Entweder mit @Transient (dann wird das Property ignoriert) oder mit @ManyToOne annotieren.


----------



## FT77 (25. Jul 2007)

Ich bin neu hier, wie markiere ich ein Thema als erledigt?


----------

