Problem mit

  • Themenstarter Themenstarter Peter Müller
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
P

Peter Müller

Gast
Ich möchte folgendes Realisieren:

Eine Dynamische Maske soll mir eine sprachspezifische Ausgabe anzeigen. Hierzu habe ich drei Tabellen

Language = Eigenschaften für die aktuelle gewählte Sprache
int id (Primary Key)
String nam

Lookup = Die einzelnen Items einer Combobox - List
int id (Primary Key)
String Ffieldname
String Value

LookupData
int lookup_ID
int language_ID
String name // Itemtext

D.h. wenn z.B. der Benutzer Deutsch auswählt soll gibt es eine Eindeutige Identifikation welche Items für die Combobox angezeigt werden sollen.

Code:
package  lookuplanganguemodel.persitence;

import java.io.Serializable;

import javax.persistence.EmbeddedId;
import javax.persistence.Entity;
import javax.persistence.Table;

public class LookupDataID implements Serializable {
	private static final long serialVersionUID = 1L;
	
        int lookup_id;
        int language_id;
	
	public int getLookupID() {
		return this.lookup_id;
	}

	public void setLookupID(int id) {
		this.lookup_id = id;
	}

	public int geLanguageID() {
		return this.language_id;
	}

	public void setLanguageID(int id) {
		this.language_id = id;
	}
}
Lookup-Data ID

Code:
package  lookuplanganguemodel.persitence;

import java.io.Serializable;

import javax.persistence.EmbeddedId;
import javax.persistence.Entity;
import javax.persistence.Table;

@Entity
@Table(name = "lookup_data")
public class LookupData implements Serializable {
	private static final long serialVersionUID = 1L;

	
	/**
	 * @directed true
	 */
	
	[color=red]@EmbeddedId[/color]         // <<-----------    FEHLER ???????????????????????????????
	private LookupDataID id;
	private String       name;

	public LookupData() {
		super();
	}

	public LookupDataID getId() {
		return id;
	}

	public void setId(LookupDataID id) {
		this.id = id;
	}

	public String getName() {
		return this.name;
	}

	public void setName(String name) {
		this.name = name;
	}
}

Code:
package  lookuplanganguemodel.persitence;

import java.io.Serializable;
import java.sql.Timestamp;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;


@Entity
public class Lookup implements Serializable {
	private static final long serialVersionUID = 1L;

	@Column(name="id")
	private int       id;
	@Column(name="name")

	public Lookup() {
		super();
	}

	public int getId() {
		return this.id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getName() {
		return this.name;
	}

	public void setName(String name) {
		this.name = name;
	}
}
Lookup Entity - Bean


Code:
package  lookuplanganguemodel.persitence;

import java.io.Serializable;
import java.sql.Timestamp;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;

@Entity
public class Language implements Serializable {
	@Id
	private int    id;
	private String name;

	private static final long serialVersionUID = 1L;

	public Language() {
		super();
	}

	public int getId() {
		return this.id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getName() {
		return this.name;
	}

	public void setName(String name) {
		this.name = name;
	}
}


Code:
package  lookuplanganguetest.bean;

import  lookuplanganguemodel.persitence.*;
import  lookuplangangueutils.db.SessionFactory;

import org.hibernate.Session;
import org.hibernate.Transaction;

public class TestLookup {
	public void save() {
	       LookupDataID   id = new LookupDataID(1, 1);
	       LookupData   data = new LookupData();
		   
	       data.setId(id);

	       Session     session  = SessionFactory.getSessionFactory().openSession();
	       Transaction tx       = session.beginTransaction();
	       session.save(data);
	       tx.commit();
	       session.close();
	}
}
Testfunktion zum testen des speicherns in eine MySQL - Datenbank

Diese habe ich mir Anhand von
Sebastian Hennebrüder "Hibernate - Das Praxisbuch für Entwickler", Galileo Computing, S. 184

erstellt, wenn ich es aber kompiliere erhalte ich an der oben gekennzeichneten Stelle einen Fehler mit der Fehlermeldung:

Exception in thread "main" org.hibernate.MappingException: Unknown entity: lookuplanganguemodel.persitence.LookupData
at org.hibernate.impl.SessionFactoryImpl.getEntityPersister(SessionFactoryImpl.java:547)
at org.hibernate.impl.SessionImpl.getEntityPersister(SessionImpl.java:1331)
at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:96)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:186)
at org.hibernate.event.def.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:33)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:175)
at org.hibernate.event.def.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:27)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:70)
at org.hibernate.impl.SessionImpl.fireSave(SessionImpl.java:537)
at org.hibernate.impl.SessionImpl.save(SessionImpl.java:525)
at org.hibernate.impl.SessionImpl.save(SessionImpl.java:521)
at lookuplanganguetest.bean.TestLookup.save(TestLookup.java:28)
at lookuplanganguetest.bean.Test.main(Test.java:15)

Was mache ich hier Falsch?
 
Code:
@Embeddable
public class LookupDataID {
...
}
 
Anonymous hat gesagt.:
Code:
@Embeddable
public class LookupDataID {
...
}

Wenn ich vor LookupDataID das Embeddable schreibe erhalte ich die Fehlermeldung in etwas "Disallowed at this place". Wie sieht es aus darf ich innerhalb dieser Klasse auch die Annotation @Column verwenden?
 
Peter Müller hat gesagt.:
Wenn ich vor LookupDataID das Embeddable schreibe erhalte ich die Fehlermeldung in etwas "Disallowed at this place". Wie sieht es aus darf ich innerhalb dieser Klasse auch die Annotation @Column verwenden?
Du sollst es auch nicht vor das Id-Feld schreiben, sondern an der Klasse LookupDataID.
Code:
@Embeddable 
public class LookupDataID { 
... 
}

public class LookupData {
   @EmbeddedId
   private LookupDataID id;
   ...
}
 
Hi,

genauso sieht es aus, mit den einzigen Unterschieden

1. Vor der Klasse "LookupData" steht noch die @Entity und @Table(name="lookup_data")
2. LookupData und LookupDataID sind "natürlich" in zwei unterschiedlichen Dateien (aber gleiches Verzeichnis)
3. Beide Klassen sind Serializabled
4. Vor lookup_id und language_id der Klasse LookupDataID befindet sich jeweils eine @Column angabe.

Ich versteh es einfach nicht, wo das Problem liegt?
 
Wie sieht deine persistence.xml Datei aus? Benennst du die Klassen einzeln oder lässt du Hibernate danach suchen?
 
Stimmte hatte vergessen dieses im Descriptor zu mappen. Dank für die Hilfe.
 
Füge einfach die folgende Zeile in die persistence.xml
Code:
<property name="hibernate.archive.autodetection" value="class" />
ein und entferne alle class-Zeilen und das exclude-unlisted-classes
Code:
<class>was.auch.immer.Klasse1</class>
<class>was.auch.immer.Klasse2</class>
<exclude-unlisted-classes>true</exclude-unlisted-classes>
 
Anonymous hat gesagt.:
Füge einfach die folgende Zeile in die persistence.xml
Code:
<property name="hibernate.archive.autodetection" value="class" />
ein und entferne alle class-Zeilen und das exclude-unlisted-classes
Code:
<class>was.auch.immer.Klasse1</class>
<class>was.auch.immer.Klasse2</class>
<exclude-unlisted-classes>true</exclude-unlisted-classes>

Wie bereits beschrieben hatte ich vergessen, dieses in der hibernate.cfg.xml zu mappen. Wieso also Persistence.xml? Es handelt sich um Hibernate.
 
Hibernate implementiert den JPA Standard.

Da du keine hibernatespezifischen Features benutzt macht es eigentlich Sinn die persistence.xml zu nutzen anstatt hibernate.cfg.xml
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben