Hibernate und Vererbung

Bergmann

Aktives Mitglied
Hey,

ich hab jetzt schon einige Topics zu Vererbung gelesen, aber für mein Problem noch keine Lösung gefunden. Ich habe folgende Klassen:

Java:
@MappedSuperclass
public class Title implements Serializable{
	
    public static final int TYPE_GAME  = 0;
    public static final int TYPE_MOVIE = 1;
    
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long uid;
    @Version
    private int version;
    
    private String name, description;
    
    protected int type; //Typ des Titels - wird von Superklassen gesetzt
    
    private String name, description;
    
    protected int type; //Typ des Titels - wird von Superklassen gesetzt

    /* ... */
}

@Entity
public class Game extends Title implements Serializable{
	
    private String genre;
	
	public String getGenre(){
		return genre;
	}
	
	public void setGenre(String _genre){
		genre = _genre;
	}
	
    @Override
    public String toString() {
        return "GAME: " + super.toString() + ", " + genre;
    }
	
	public Game(){
		this("", "", "");
	}
	
	public Game(String _name, String _description, String _genre){
		super(_name, _description);
		genre = _genre;
		type  = TYPE_GAME;
	}
}

@Entity
public class Movie extends Title implements Serializable{

    private String genre;
	
	public String getGenre(){
		return genre;
	}
	
	public void setGenre(String _genre){
		genre = _genre;
	}	
	
    @Override
    public String toString() {
        return "MOVIE: " + super.toString() + ", " + genre;
    }	
	
	public Movie(){
		this("", "", "");
	}
	
	public Movie(String _name, String _description, String _genre){
		super(_name, _description);
		genre = _genre;
		type  = TYPE_MOVIE;
	}
}

Die Klassen Game und Movie sind zur Zeit noch fast identisch, aber das ändert sich später noch. Dann habe ich verschiedene Klassen, die Titel benutzten. Die Titel wurden aber nicht als Titel erzeugt, sondern als Game oder Movie und dann bloß an ein Feld vom Typ Titel übergeben. Dazu hat Titel auch das Feld 'type' das ich auf Game oder Movie casten kann, wenn ich es benötige. Soweit so gut. Jetzt will ich die Titel mit Hibernate in der Datenbank speichern. Aber Hibernate weiß nicht, das der Titel eigentlich ein Game bzw ein Movie ist. Casten geht ja an der Stelle auch nich wirklich. Wie bekomm ich nun die Daten in die Datenbank?

MfG & Thx Bergmann.
 
Zuletzt bearbeitet:

JimPanse

Bekanntes Mitglied
Ich hoffe ich habe es richtig verstanden, wenn ja:

Kann Hibernate Title nicht speichern weil es keine Entity ist!
Java:
@MappedSuperclass:
Wenn du Attribute vererben willst die gleich sind!

Java:
@Entity
@Inheritance(strategy = InheritanceType.<Strategy>)
Wäre hier sinnvoller! Dann brauchst du noch eine geeignete Strategie (JOINED, SINGLE_TABLE oder TABLE_PER_CLASS).

In deinem Fall wäre JOINED am sinnvollsten, d.h. alle Attribute die gleich sind landen in der Tabelle Title -> die abgeleiten Klassen + Attributen landen in einer eigenen Tabelle.
 

Bergmann

Aktives Mitglied
Hey,

hast mich leider falsch verstanden, war auch bisl komisch geschrieben. Hier ma n kleines Bsp was ich vor habe:

Java:
//Klasse die einen Titel besitzt:
@Entity
public class Medium implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long uid;
    @Version
    private int version;

    /*...*/

    @OneToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "titleID")
    private Title title; //Title, der auf dem Medium gespeichert ist

    /*...*/

    public Title getTitle(){ 
    	return title;
    }

    public void setTitle(Title _title){
    	title = _title;
    }
}

//ein Titel wird an die Klasse übergeben:
Game g = new Game();
medium.setTitle(g);

//arbeiten mit dem Title:
Titel t = medium.getTitle();
switch(t.getType()){
    case Title.TYPE_GAME:{
        Game g = t;
        //Code der mit Game arbeitet
    }break;
    case Titel.TYPE_MOVIE:{
        Movie m = t;
        //Code der mit Movie arbeitet
    }break;
    case Title.TYPE_TITLE:{
        throw new Exception("...");
    }
}
Es gibt also nie eine Instanz von Title, es werden immer nur Games und Movies erzeugt und Title wird dazu genutzt die Objekte zu speichern. Und jetzt will ich in Hibernate das Game bzw. das Movie speichern, nicht den Titel. Ich könnte natürlich auch für jede Kindklasse ein eigenes Feld in Medium anlegen, aber da das es noch ein paar mehr werden, wird das dann ziemlich unübersichtlich und die Vererbung ist ja auch dazu gedacht das so zu lösen wie ich das jetzt hab.

MfG Bergmann.
 

JimPanse

Bekanntes Mitglied
???? Ich verstehe nicht was du vor hast

"...Es gibt also nie eine Instanz von Title"!
Java:
@OneToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "titleID")
    private Title title; //Title, der auf dem Medium gespeichert ist

Bedeutet aber: Es gibt eine 1:1 von Title zu Medium! Also muss Title auch als solche in der DB vorhandenen sein, weil wie soll sonst die Referenzierung erfolgen?

Java:
Game g = new Game();
medium.setTitle(g);
 
//arbeiten mit dem Title:
Titel t = medium.getTitle();
switch(t.getType()){
    case Title.TYPE_GAME:{
        Game g = t;
        //Code der mit Game arbeitet
    }break;
    case Titel.TYPE_MOVIE:{
        Movie m = t;
        //Code der mit Movie arbeitet
    }break;
    case Title.TYPE_TITLE:{
        throw new Exception("...");
    }
}

Wenn du so vorgehen willst, dann musst du die Vererbung nutzen so wie ich sie dir vorher beschrieben habe!
 

Bergmann

Aktives Mitglied
Hey,

wenn es eine 1:1 Beziehung wäre würde ich dir Recht geben, aber von Medium zu Titel gibt es eine n:1 Beziehung. Mehrere Medien (DVD, BlueRay, VHS, ...) können ein und den selben Titel haben.
Vlt ist es aber auch besser, da eine Verebung zu nutzen. Dann sind zwar einige Daten doppelt, aber es ist einfacher zu verwalten. Das muss ich aber erst mit meinen Teamkollegen besprechen...

MfG Bergmann.
 

JimPanse

Bekanntes Mitglied
Hey,

wenn es eine 1:1 Beziehung wäre würde ich dir Recht geben, aber von Medium zu Titel gibt es eine n:1 Beziehung. Mehrere Medien (DVD, BlueRay, VHS, ...) können ein und den selben Titel haben.
Vlt ist es aber auch besser, da eine Verebung zu nutzen. Dann sind zwar einige Daten doppelt, aber es ist einfacher zu verwalten. Das muss ich aber erst mit meinen Teamkollegen besprechen...

MfG Bergmann.

Du verwirrst mich :D du hast aber eine 1:1 Beziehnung modelliert:
Java:
@OneToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "titleID")
    private Title title;


wenn dann:
Java:
public class Medium{
@ManyToOne
private Title title;
...
}

;-)
 

Bergmann

Aktives Mitglied
Hey,

Du verwirrst mich :D
Das liegt daran, das ich selber verwirrt war^^ Aber wir haben heut in der Vorlesung unseren Prof gefragt und jetz gehts:
Java:
@Entity
@Inheritance(strategy=InheritanceType.JOINED)
public class Title implements Serializable{
	
	public static final int TYPE_TITLE = -1;
	public static final int TYPE_GAME  =  0;
	public static final int TYPE_MOVIE =  1;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long uid;
    @Version
    private int version;
    
    private String name, description;
    
    protected int type; //Typ des Titels - wird von Superklassen gesetzt

    /*...*/
}

@Entity
public class Game extends Title implements Serializable{
	
	private String genre;
		
	public String getGenre(){
		return genre;
	}
	
	public void setGenre(String _genre){
		genre = _genre;
	}

    /*...*/
}

@Entity
public class Medium implements Serializable {

    /*...*/
    
    @ManyToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "titleID")
    private Title title; //Title, der auf dem Medium gespeichert ist

    /*...*/
}

Danke für die Hilfe und die Nerven :)

MfG Bergmann
 

mvitz

Top Contributor
Ich möchte dazu noch etwas anmerken:

Wenn ihr im Title über Integer Konstanten den Typ der späteren Subklasse euch merkt, ist das äußerst ungünstig, da die Vaterklasse ihre Kinder ja nicht kennen soll/braucht. Wenn ihr wirklich irgendwann von Title auf z.B. Game casten müsst, solltet ihr das an der Stelle mit "instance of" machen und nicht über eine Konstante der Vaterklasse. Und wenn ihr das trotzdem so lasst, würde ich das ganze wenigstens über ein ENUM machen und nicht über int.
 

Bergmann

Aktives Mitglied
Hey,

@mvitz: Danke, werd das noch ändern. Hab noch nich so viel mit Java gemacht :)
@nocturne: Hibernate is ne Vorgabe vom Prof -.-

MfG Bergmann
 

nocturne

Bekanntes Mitglied
Hey,

@mvitz: Danke, werd das noch ändern. Hab noch nich so viel mit Java gemacht :)
@nocturne: Hibernate is ne Vorgabe vom Prof -.-

MfG Bergmann

edbd erzeugt hibernate-klassen und datenbanken.

Programmiersprachen

* J5EE Beans mit JavaDoc (Java 5 Enterprise Edition)
Die Vererbung der Tabellen der PostgreSQL-Datenbank wird auf die Java-Beans übernommen.
* Hibernate (Java5)
o Hibernate Annotations
o Hibernate Validator 3
o Hibernate Validator 4
o Auflösen der 1-1 Relationen
o Auflösen der n-1 Relationen
o Hibernate Enver (Easy Entity Auditing)
o Hibernate Versioning (Verhindert konkurierende Updates)
o Vererbung
* Java Server Faces (Java 5 Enterprise Edition)
o Entitys als Select-Item's
* Erstellen von PHP-Klassen mit den Spaltenfeldern
o Entitys als Select-Item's


Hier mein Beispiel:
CREATE TABLE "public"."name" (
"label" TEXT
) WITHOUT OIDS;

CREATE TABLE "public"."mandant" (
"mandantid" BIGSERIAL,
"contact" TEXT,
CONSTRAINT "mandant_pkey" PRIMARY KEY("mandantid")
) INHERITS ("public"."name")
WITHOUT OIDS;


Und Java:
Java:
package org.enexus.releasemanagement.entitybeans;
import java.io.Serializable;
import org.hibernate.validator.*;
import javax.validation.constraints.*;
import org.hibernate.envers.Audited;
import javax.persistence.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Collection;
import org.hibernate.annotations.AccessType;
import javax.faces.model.SelectItem;
import org.hibernate.validator.Pattern;
import org.hibernate.validator.NotNull;
/**
 * <hr/>
 * <b style=font-size:12pt>Name</b>
 * <ul>
 *   <li>{@link #getLabel Label} </li>
 * </ul>
 */
@Audited
@MappedSuperclass
@AccessType("property")
@SuppressWarnings({"unused", "serial"})
public class Name extends SelectItem implements Serializable{
  // class fields
 
  private String label;

  public Name(){
    super();
    setValue(this);
  }
 
 

  @Length(max=24,min=3)
  /**  
   */  
  @Column(name = "label")
  public String getLabel() {return this.label;};
  public void setLabel(String label) {
    this.label = label;
  };
}

und [JAVA=27]
package org.enexus.releasemanagement.entitybeans;
import java.io.Serializable;
import org.hibernate.validator.*;
import javax.validation.constraints.*;
import org.hibernate.envers.Audited;
import javax.persistence.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Collection;
import org.hibernate.annotations.AccessType;
import javax.faces.model.SelectItem;
import org.hibernate.validator.Pattern;
import org.hibernate.validator.NotNull;
/**
* <hr/>
* <b style=font-size:12pt>Der Mandant einer Firma</b>
* <ul>
* <li>{@link #getMandantid Mandantid} </li>
* <li>{@link #getContact Contact} </li>
* </ul>
*/
@Audited
@Entity
@Table(name= "mandant")
@AccessType("property")
@SuppressWarnings({"unused", "serial"})
public class Mandant extends Name implements Serializable{
// class fields

private int mandantid;

private String contact;

public Mandant(){
super();
setValue(this);
}



/**
*/
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator="mandant_mandantid_seq")
@SequenceGenerator(sequenceName="mandant_mandantid_seq", name="mandant_mandantid_seq", allocationSize=1)
@Column(name = "mandantid", insertable = false) // auto increment
public int getMandantid() {return this.mandantid;};
public void setMandantid(int mandantid) {
this.mandantid = mandantid;
};
// project_group
/**
* Many-To-One
*
* @deprecated Please use {@link ProjectGroup#setMandant(ProjectGroup) ProjectGroup.setMandant()} instead
*/
@OneToMany(mappedBy = "mandant", fetch = FetchType.LAZY)
public List<ProjectGroup> getProjektgruppen(){return this.projektgruppen;}
List<ProjectGroup> projektgruppen = new ArrayList<ProjectGroup>();
public void setProjektgruppen(List<ProjectGroup> projektgruppen){this.projektgruppen = projektgruppen;}



@Length(max=24,min=3)
/**
*/
@Column(name = "contact")
public String getContact() {return this.contact;};
public void setContact(String contact) {
this.contact = contact;
};
}

[/code]
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
torresbig MySQL hibernate - could not resolve entity class ... (Datenbank Anfänger) Datenbankprogrammierung 19
I Hibernate Predicate mit IN Clause "Unaware how to convert value to requested type" Datenbankprogrammierung 0
T org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: ..., could not initialize proxy - no Session Datenbankprogrammierung 5
T Realisierungsvorschläge Hibernate SQL Datenbankprogrammierung 1
Zrebna Wie mittels Hibernate eine Join-Tabelle als eigene Java-Klasse erstellen? Datenbankprogrammierung 5
Zrebna Tabellen-Erzeugung via Hibernate ignoriert 'CascadeType' settings Datenbankprogrammierung 1
I Hibernate / JPA - Spaltenname von Query (Select) bekommen Datenbankprogrammierung 6
M Mysql Views und Hibernate Caching Datenbankprogrammierung 4
damike84 Hibernate: persistieren eines Graphen Datenbankprogrammierung 2
N Hibernate Entitäten bei Selects aus 2 Tabellen Datenbankprogrammierung 7
OnDemand Hibernate Realationen Datenbankprogrammierung 7
OnDemand Hibernate ManyToOne Datenbankprogrammierung 5
D Hibernate oneToMany Syntaxfehler Datenbankprogrammierung 3
D Hibernate Error: NoSuchMethodError Datenbankprogrammierung 4
D hibernate mit postgreSQL Datenbankprogrammierung 3
S MySQL Hibernate: Fehler bei Verwendung von 2 unterschiedlichen Enumration Datenbankprogrammierung 3
F Problem mit Hibernate c3p0 Datenbankprogrammierung 2
OnDemand MySQL Trigger löst nicht aus bei Hibernate Update Datenbankprogrammierung 12
OnDemand Hibernate OneToMany ManyToOne Datenbankprogrammierung 61
J Hibernate One-To-One mit Where Klausel Datenbankprogrammierung 6
L hibernate.cfg.xml Could not parse configuration Datenbankprogrammierung 0
L H2 Hibernate definieren? Datenbankprogrammierung 1
T JPA Mapping Enum (hibernate 5) Datenbankprogrammierung 1
H In hibernate.cfg.xml schreiben und auslesen Datenbankprogrammierung 0
K Hibernate: Ein Fluch Datenbankprogrammierung 3
K Java Object mit Hibernate in MySQL abspeichern Datenbankprogrammierung 1
K Eclipse: JBoss Hibernate Tool: Kein Zugriff auf Datenbank Datenbankprogrammierung 5
S JpaRepositories & Hibernate: ungewolltes trim() in findBy Datenbankprogrammierung 7
S MySQL hibernate exception: illegal state exception : entityManagerFactory is closed Datenbankprogrammierung 5
S Hibernate: Verschiedene Klassen zurückgeben. Datenbankprogrammierung 2
looparda Architektur für JPA Hibernate Umstieg Datenbankprogrammierung 14
O HSQLDB Hibernate Criteria Problem Datenbankprogrammierung 3
perlenfischer1984 Hibernate mit final members Datenbankprogrammierung 3
perlenfischer1984 Java Objecte speichern mit Hibernate ? Datenbankprogrammierung 2
N SQLite Hibernate und Aufruf von Funktion SELECT last_insert_rowid() Datenbankprogrammierung 2
N Sqlite3 und Hibernate Datenbankprogrammierung 3
A Hibernate Cache leeren Datenbankprogrammierung 4
I MySQL Hibernate zu viele Queries Datenbankprogrammierung 2
Psypsy Hibernate / JPA erkennen von schon gespeicherten Objekten Datenbankprogrammierung 4
Psypsy Hibernate / JPA OneToOne MappedBy Frage Datenbankprogrammierung 2
J Hibernate + DTOs - DTOs in DAOs verwenden? Datenbankprogrammierung 1
S Hibernate-Konfiguration : Unverständliche Ausgabe beim Ausführen Datenbankprogrammierung 0
I MySQL Hibernate / MySQL alias in WHERE clause Datenbankprogrammierung 1
J Hibernate + HSQL embedded Datenbankprogrammierung 2
P Hibernate Einstieg Datenbankprogrammierung 5
C Hibernate und createQuery Datenbankprogrammierung 2
V kennt jemand empfehlenswerte online tutorials zur Hibernate ? gerne auch englisch. Datenbankprogrammierung 4
G H2 Hibernate - wie joins machen Datenbankprogrammierung 1
D Hibernate: Zustand eines Objekts erkennen? Datenbankprogrammierung 0
D Unterschiede Hibernate Vs. Java Persistence API Datenbankprogrammierung 8
I Hibernate / JPA Index hinzufügen Datenbankprogrammierung 1
X Hibernate Cache Verständnisproblem Datenbankprogrammierung 0
T Hibernate und inner class Datenbankprogrammierung 0
K n:m Tabellen mit Hibernate erstellen Datenbankprogrammierung 1
T Hibernate DAO gute Tutorials/Bücher gesucht Datenbankprogrammierung 0
C Hibernate: could not resolve property Datenbankprogrammierung 1
J Plug-In-Framework für Hibernate-Klassen Datenbankprogrammierung 0
M Hibernate - Save Child wenn nötig Datenbankprogrammierung 10
M DAO's + Hibernate Theorie Datenbankprogrammierung 4
T Hibernate, HSQLDB und UNIQUE Datenbankprogrammierung 2
F Hibernate - verschiedene Schemen Datenbankprogrammierung 7
D Hibernate SaveOrUpdate Exception Datenbankprogrammierung 2
D Hibernate CreateQuery ohne Result Datenbankprogrammierung 7
E MySQL Hibernate mit JaxWS führt zu LazyInitialization Exception Datenbankprogrammierung 8
L Einarbeitung in Hibernate -> wenn gute SQL Kenntnisse vorhanden? Datenbankprogrammierung 2
B DB2 Hibernate findet Datenbank nicht Datenbankprogrammierung 18
K JPA / Hibernate Annotations Datenbankprogrammierung 4
M JPA / Hibernate mit Postgres DB Datenbankprogrammierung 3
P JSF + H2 + TomEE + Hibernate/JPA Datenbank wird nicht angelegt Datenbankprogrammierung 3
E MySQL Hibernate ( Anfänger ) Datenbankprogrammierung 3
P Lazy-Fetchig und Session-Problem mit Hibernate Datenbankprogrammierung 4
J Hibernate Select auf Parameterliste Datenbankprogrammierung 3
C Hibernate ManyToMany zusammengesetzter Primärschlüssel, problem. Datenbankprogrammierung 3
P Oracle Hibernate - Oracle-VarChar-Index wird nicht genutzt Datenbankprogrammierung 3
M Hibernate Foreign Key definieren Datenbankprogrammierung 4
M Abstrakte Klassen Hibernate Datenbankprogrammierung 4
D Mit Hibernate (mit Annotation) auf Views zugreifen Datenbankprogrammierung 2
M [Hibernate]Abgleich eines lokalen Objekts mit dem Zustand aus der Datenbank. Datenbankprogrammierung 3
P Mit Hibernate mehrere Datensätze löschen Datenbankprogrammierung 7
P Probleme mit meinem 1. Hibernate Beispiel Datenbankprogrammierung 3
P erste Schritte mit Hibernate Datenbankprogrammierung 3
V Hibernate Interfaces von anderem Projekt Datenbankprogrammierung 2
J MySQL Datenbank konfigurieren, JDBC, MySQL oder Hibernate Datenbankprogrammierung 2
B Hibernate und portierbare Datenbank Datenbankprogrammierung 3
qwerqer [Hibernate] Mappingvarianten Datenbankprogrammierung 2
lumo Teneo Hibernate & JPA Datenbankprogrammierung 15
Z JPA mit Hibernate - Unable to build EntityManagerFactory Datenbankprogrammierung 7
Dit_ Hibernate, effiziente SQL-Abfrage definieren Datenbankprogrammierung 5
K Hibernate vs. JDBC Datenbankprogrammierung 4
J Hibernate Info 593 ? Datenbankprogrammierung 4
J Erstellen der SessionFactory in Hibernate 4.1 Datenbankprogrammierung 2
L PostgreSQL Hibernate-Frage Datenbankprogrammierung 2
X MySQL Hibernate: Massenupdate auf unbekannte Tabelle Datenbankprogrammierung 4
N hibernate: datasource Datenbankprogrammierung 7
H MySQL Hibernate: Updaten vereinfachen Datenbankprogrammierung 2
T Hibernate Division zweier Summen Datenbankprogrammierung 4
B MySQL Fehler: Cannot open connection mit Tomcat7, Hibernate und MySQL Datenbankprogrammierung 4
F GWT und Hibernate - gwt.dev.Compler not found Datenbankprogrammierung 3
M NestedTransaction- Exception in Hibernate Datenbankprogrammierung 15
O Löschen vieler Datensätze mit Hibernate Datenbankprogrammierung 11

Ähnliche Java Themen

Neue Themen


Oben