Hibernate Composite key

Generic1

Top Contributor
Hallo,

ich versuche gerade mittels Hibernate eine Relationstabelle zwischen 2 Tabellen zum laufen zu bringen.
Die Entitys schauen so aus:

Code:
                   1:n                                                n:1
Event <--------------------> Participance <------------------------> Participant
pk_event                              id_event/id_part                                  pk_part

Java:
@Entity
@SuppressWarnings("serial")
@Table(name="TEvent")
public class Event implements Serializable {

    private Integer pk_event;
    private String eventname;
    private Timestamp eventtime;
    private Integer fee;

    public Event() {}

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    public Integer getPk_event() {
        return pk_event;
        }

    public void setPk_event(final Integer pk_event) {
        this.pk_event = pk_event;
        }

    @ManyToMany(
        fetch=FetchType.EAGER,             
        cascade = {CascadeType.PERSIST, CascadeType.MERGE},
        mappedBy = "events",
        targetEntity = Runningmode.class)
    public Collection<Runningmode> getRunningmodes() {
        return runningmodes;
        }
...

Java:
@Entity
@Table(name="TParticipance")
public class Participance implements Serializable {

    @Id
    private ParticipantEventPK participantEventPK = new ParticipantEventPK();
    @SuppressWarnings("unused")
    @Column(name="id_event", nullable=false, updatable=false, insertable=false)
    private Integer id_event;
    @SuppressWarnings("unused")
    @Column(name="id_part", nullable=false, updatable=false, insertable=false)
    private Integer id_part;
    private Boolean paid;
    private float paidvalue;
    private String paidPer;
    private Participant participant;
    private Event event;

    public Participance() {}

    public void setParticipantEventPK(ParticipantEventPK participantEventPK) {
        this.participantEventPK = participantEventPK;
        }

    public ParticipantEventPK getParticipantEventPK() {
        return participantEventPK;
        }

    public Participant getParticipant() {
        return participant;
        }

    public void setParticipant(final Participant participant) {
        this.participant = participant;
        }

    public Event getEvent() {
        return event;
        }

    public void setEvent(final Event event) {
        this.event = event;
        }

    ...

Composite Key:
Java:
@Embeddable
public class ParticipantEventPK implements Serializable {

    @ManyToOne
    private Participant participant;
    @ManyToOne
    private Event event;

    public ParticipantEventPK() {
        }

    public Participant getParticipant() {
        return participant;
        }

    public void setParticipant(Participant participant) {
        this.participant = participant;
        }

    public Event getEvent() {
        return event;
        }

    public void setEvent(Event event) {
        this.event = event;
      }
}

Java:
@Entity
@SuppressWarnings("serial")
@Table(name="TParticipant")
public class Participant implements Serializable {

  private Integer pk_part;
  private String firstname;
  
  public Participant() {
    }

  @Id
  @GeneratedValue(strategy=GenerationType.AUTO)
  public Integer getPk_part() {
        return pk_part;
        }

  public void setPk_part(final Integer pk_part) {
        this.pk_part = pk_part;
        }
...

Kompilieren tut das ganze einwandfrei, wenn ich aber jetzt ein "participance" - Objekt speichern möchte (mit getHibernateTemplate().saveOrUpdate(participance);) bekomme ich folgende Exception:

Code:
Exception class RegistrationService, Method saveRegistrationData: 
org.springframework.dao.InvalidDataAccessResourceUsageException: could not retrieve snapshot: 
[at.myappl.participant.domain.Participance#component[event,participant]{event=null, 
participant=null}]; SQL [select participan_.event_pk_event, participan_.participant_pk_part, participan_.bruttostarttime as bruttost1_2_, participan_.bruttotime as bruttotime2_, 
participan_.endtime as endtime2_, participan_.event as event2_, participan_.meantime1 as 
meantime7_2_, participan_.meantime2 as meantime8_2_, participan_.meantime3 as meantime9_2_,
 participan_.meantime4 as meantime10_2_, participan_.meantime5 as meantime11_2_, 
participan_.nettotime as nettotime2_, participan_.paid as paid2_, participan_.paidPer as paidPer2_, 
participan_.paidvalue as paidvalue2_, participan_.participant as partici16_2_, participan_.runningmode
 as running17_2_, participan_.starttime as starttime2_ from TParticipance participan_ where 
participan_.event_pk_event=? and participan_.participant_pk_part=?]; nested exception is 
org.hibernate.exception.SQLGrammarException: could not retrieve snapshot: 
[at.myappl.participant.domain.Participance#component[event,participant]{event=null, participant=null}]

19.04.2011 06:54:52 org.hibernate.util.JDBCExceptionReporter logExceptions
WARNUNG: SQL Error: 1054, SQLState: 42S22
19.04.2011 06:54:52 org.hibernate.util.JDBCExceptionReporter logExceptions
SCHWERWIEGEND: Unknown column 'participan_.event_pk_event' in 'field list'

Weiß jemand was ich da falsch mache?
Das mit dem zusammengesetzten Key hab ich von hier: MAD Code Monkeys: Hibernate annotations: The composite primary key with foreign keys references

Vielen Dank,
lg
 
S

SlaterB

Gast
muss nicht irgendwo angegeben sein, welche Spalte zu den Attributen in ParticipantEventPK gehört?
dass in Participance gleichzeitig noch id_event usw. gemappt ist, scheint mir nicht automatisch verknüpft

hier
Hibernate Annotations
"2.2.3.2.1. @EmbeddedId property"
wird allerdings nur mit @AttributeOverride gearbeitet, was genaueres noch nicht gesehen,
selber nicht irgendwo auf der Welt erstmal ein funktionierendes Beispiel kopiert bevor du etwas ausprobierst?

generell halte ich überhaupt nichts von Annotations, ich verwende nur saubere Mapping-Dateien,
da finde ich auch sofort ein komplettes Beispiel (key-Property mit zugeordneter Column):
Hibernate + composite primary keys - TheServerSide.com
 

Generic1

Top Contributor
Hallom

ich hab (leider) mit den Annotations angefangen bin aber jetzt auch draufgekommen, dass eine XML Config- Datei besser wäre.
Mir ist bei dem unteren Beispiel nicht klar, warum bei
@AttributeOverride(name="firstName", column=@Column(name="fld_firstname") nur der firstName angeführt ist und nicht der lastName.
Der Composite Key besteht ja aus dem firstName und dem lastName?
Ich hatte da jetzt statt firstName -> "userId" als name verwendet!?

Besten Dank,

lg
Generic1

Java:
@Entity
class User {

  @EmbeddedId
  @AttributeOverride(name="firstName", column=@Column(name="fld_firstname")
  UserId id;

  Integer age;
}

@Embeddable
class UserId implements Serializable {

  String firstName;
  String lastName;
}
 
Zuletzt bearbeitet:
S

SlaterB

Gast
ich bin in der Tat mit dem Beispiel auch nicht zufrieden, mehr kann ich dazu aber nicht sagen,

reicht nicht z.B. auch
@Column(name="id_event", nullable=false, updatable=false, insertable=false)
in deinen ParticipantEventPK zu schreiben oder was immer man bei einem derartigen Attribut sonst hinschreibt?
 

Generic1

Top Contributor
Hallo nochmal,

ich hab jetzt die ganze Nacht an dem Problem gearbeitet bin aber leider auf keinen grünen Zweig gekommen und komm jetzt nicht mehr weiter.
Vielleicht könntest du dir/ ihr euch das nochmal ansehen,
Ich hab jetzt ein ganz einfaches/kleines Programm gemacht in dem der Fehler auch auftritt.
Um das Beispiel ausführen zu können, braucht man eine MYSQL datenbank, die CREATE TABLE SQL- STATEMENTS sind im Ordner dabei. die Applikation hab ich mit Netbeans programmiert (alle benötigten JARS sind im Programm dabei) - es müsste also sehr einfach sein, das Programm zum Laufen zu bringen.
Ich wäre sehr dankbar, wenn jemand eine Lösung bereit hätte für dieses Problem (und würd mich natürlich auch erkenntlich ziegen.)

Besten Dank einstweil und lg

Downloadlink:
File-Upload.net - SpringHibernate.zip
 

Generic1

Top Contributor
Oder hat jemand noch eine andere Idee, wie ich das machen könnte, ich steh momentan völlig an und weiß nicht wie ich weiterkommen soll,

Das DB Schema müsste fast so aussehen, da es so am intuitivsten ist und am leichtesten zu verwenden.
lg

PS: für eine Lösung würde ich auch einiges Ausgeben/Überweisen, da mir klar ist, dass man das nicht so im vorbeigehen macht.
lg
 
S

SlaterB

Gast
kommt für dich die allgemeine Lösung in Frage, auf Composite Key zu verzichten und in Participance einfach eine neue Integer-Id einzufügen?
Participant + Event wären dann ganz normale Fremdschlüssel-gemappte Objekte
 

Generic1

Top Contributor
Ja, auf jeden Fall, für mich wäre nur wichtig, dass ich einen einfachen INSERT machen kann:

getHibernateTemplate().save(participance);

und das ich die Daten einfach abfragen kann:

z.B.: welcher Participant nimmt an welchen Events teil
an welchen Event nehmen welche Participants teil
usw.
 

Generic1

Top Contributor
Leider weiß ich nicht genau wie du das meinst:

Code:
Event <----------------> Participance <----------------------> Participant
                                  participance_pk
event_id                           event_fk                                       part_id
                                       part_fk

Das wäre dann ja so:

Code:
1 MyEvent1                           1 1 2                                       2 Huber
2 MyEvent2                           2 2 3                                       3 Maier
3 MyEvent3                           3 3 5                                       5 Almer
...

ich versteh jetzt nicht was mir participance_pk weiterhelfen würde? ich muss ja dann auch mittels HWL abfragen, wie z.B.:

SQL:
Select * From .....  Where event.event_id = participance.event_fk  and ...

da hilft mir participance_pk auch nicht weiter, oder hab ich da was falsch verstanden?
Besten Dank,
lg
 
S

SlaterB

Gast
> da hilft mir participance_pk auch nicht weiter

inwiefern würde es dir denn helfen wenn participance_pk NICHT da ist, wenn der Composite Key da ist oder was auch immer?

die HQL-Anfrage würde ich nach wie vor wie in
http://www.java-forum.org/datenbank...bfrage-ueber-mehrere-tabellen.html#post751021
formulieren,
von einer weiteren Id oder wer PK ist ist das komplett unabhängig

für das Mapping von event in Participance ist natürlich schon interessant wie die zugehörige Column heißt, aber dann einfach das Mapping richtig stellen und weiter gehts
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Hibernate: Dauer-Update bei composite-element Data Tier 6
I Hibernate / JPA: Eine Datenbank und pro User ein Schema Data Tier 9
T Hibernate/Spring JPA: eigene ID generieren Data Tier 5
Avalon @ManyToOne Hibernate oder JPA? Data Tier 5
D Hibernate Hibernate mit MariaDB Data Tier 1
ToBJo Hibernate Glassfish deploy mit Hibernate schlägt fehl Data Tier 1
C JPA Hibernate Map<String,String> richtig mappen Data Tier 2
S JPA Hibernate Search & EclipseLink (oder OpenJPA) Data Tier 0
R JPA Probleme mit Wechsel von EclipseLink auf Hibernate Data Tier 4
ARadauer Hibernate Entität readonly laden... Data Tier 1
G Hibernate SQL in Hibernate: Keine Parameter mit Index? Data Tier 2
P Wildfly + Hibernate + SQL Server Data Tier 0
E JPA Hibernate Query mit Timestamp hat seltsames Verhalten Data Tier 1
M Eclipse 4 RCP Hibernate Problem Data Tier 3
C Hibernate ProgressBar updaten mit Daten aus Hibernate Data Tier 4
B Hibernate und MySQL testen Data Tier 8
I Hibernate HQL: generiertes SQL ausgeben Data Tier 1
R mapping-file für hibernate zum Überschreiben der Annotationen Data Tier 7
R Hibernate Hibernate und Logback Data Tier 2
R Hibernate möchte Schema zwei mal undeployen Data Tier 2
F Hibernate Hibernate / JPA Data Tier 4
E Hibernate: Session vs EntityManager Data Tier 3
C Hibernate Hibernate Code Generation Data Tier 3
S Hibernate Mehrfachverbindung mit Hibernate Data Tier 3
M Hibernate Einstiegsfrage Data Tier 5
M Exception in thread "main" org.hibernate.MappingException: java.lang.ClassNotFoundException: Message Data Tier 4
S Hibernate Einstieg in Hibernate 3.2 sinnvoll? Data Tier 8
P JPA Eigene Vererbungsstrategie mit JPA / Hibernate Data Tier 2
J Hibernate Problem bei Master-Detail-Tabellen Data Tier 5
Y Jboss seam-hibernate-jpa Data Tier 5
RaoulDuke Hibernate Map<String,String> mit Annotations mappen Data Tier 2
M Hibernate Hibernate with GWT Data Tier 4
C Hibernate JPA mysql db erstellen Data Tier 4
M Hibernate Hibernate liest Daten zu oft aus! Data Tier 16
pg1337 Hibernate Fragen Data Tier 11
D Probleme bei Left Joins mit Hibernate createCriterias() Data Tier 2
D Hibernate probleme mit Verlinkungstabelle Data Tier 4
2 Hibernate Annotations Data Tier 7
G Hibernate select update no wait Data Tier 8
Z Hibernate: Many-To-Many nur eine bestimmte Spalte Data Tier 3
K Hibernate - Envers - Erzeugung der SQL Skripte Data Tier 4
G Hibernate 1:n Beziehung mit Vererbung Data Tier 5
D Hibernate-Criteria-API (Projections und MAX-Funktion) Data Tier 6
L Hibernate: failed to lazily initialize a collection of role Data Tier 3
S Hibernate hibernate.cfg.xml Data Tier 14
D JPA vs Hibernate.cfg und Entitymanager Data Tier 6
H Hibernate - Mapping für Enumeration Data Tier 1
R Hibernate Criteria Abfrageproblem Data Tier 2
A Hibernate und jdbc zusammen Data Tier 4
D Mit Hibernate aus JUnit ein DB-Schema erzeugen Data Tier 6
S [Hibernate] No Persistence provider for EntityManager Data Tier 5
B Problem mit org.hibernate.LazyInitializationException Data Tier 11
G Hibernate HQL und Interface Data Tier 4
G JSF Hibernate no session or session was closed Data Tier 12
T JPA2/Hibernate: Many-to-Many-Relation wird u.a. beim löschen nicht aktualisiert Data Tier 14
S (Hibernate) Mapping einer Datenbanktabelle mit mehreren Fremdschlüssel Data Tier 7
X [Hibernate] Zusammengesetzte Entities möglich? Data Tier 7
N Hibernate Fake? Data Tier 2
S Problem beim Insert mit Hibernate Data Tier 9
V Hibernate Projection Data Tier 2
T org.hibernate.impl.SessionFactoryImpl Memory Leak Data Tier 10
X [Hibernate] Connection Pool - MinSize ? Data Tier 2
R Hibernate Criteria OR Data Tier 2
T hibernate/jpa abgefragte Listen immer mit Null-Werten gefüllt Data Tier 8
X [Hibernate] Anderen Connection Pool - Vorschläge? Data Tier 3
ARadauer Hibernate DDL Loggen Data Tier 6
G Hibernate abfrage Collection Data Tier 3
X [Hibernate] ReverseEngineering - Eigene Strategy verwenden? Data Tier 3
R Hibernate Criteria .group größer als Data Tier 5
R Hibernate daten laden Data Tier 7
H [Hibernate]1:1 Beziehung Data Tier 8
H [Hibernate]No CurrentSessionContext configured! Data Tier 6
X [Hibernate] Lässt sich die Dauer eines SELECTs loggen? Data Tier 4
R Hibernate n:n Relationtabelle mit Date Data Tier 3
H [Hibernate] Unknown Entity Data Tier 3
H [Hibernate] Configuration Data Tier 3
C [Hibernate] Generierung von hbm.xml to Java Data Tier 4
lumo Eclipse & JPA & Hibernate & Derby Data Tier 5
J Zufallsauswahl aus ResultList bei JPA(Hibernate) / Performance Data Tier 3
M Hibernate: Datum 0001-01-01 erzeugt null-Datum Data Tier 4
G Datenbankzugriff mit Hibernate Data Tier 7
Y Hibernate - Angabe des Schemas Data Tier 6
LadyMilka (Hibernate) in Criteria implizierter Join durch Subquery's Data Tier 8
M Hibernate Mehr als 1 Object speichern? Data Tier 18
M Unerklärliche Hibernate Exception Data Tier 20
LadyMilka (Hibernate) subquery in FROM-Clause Data Tier 9
haemi Viele DTOs in hibernate IdentityMap Data Tier 3
LadyMilka (hibernate) UNION dem Dialekt hinzufügen Data Tier 3
M Hibernate + Oracle 10g XE Data Tier 3
lumo Hibernate - entity class not found Data Tier 5
P SQL PRoblem Hibernate? Data Tier 8
J Vererbung mit JPA / Hibernate - pro/contra Data Tier 3
T JBoss/Hibernate: Abfrage dauert lang + hohe CPU? Data Tier 19
7 Hibernate-Abfrage (SubSelect im FROM) Data Tier 2
G Hibernate: many-to-one - Verwaiste Datensätze löschen Data Tier 2
G Layer für Datenbankzugriff Hibernate Data Tier 5
G Hibernate Zwischentabelle Data Tier 2
Java.getSkill() Hibernate und Spalte vom Typ xml Data Tier 6
G Hibernate 0...1 : 1 Beziehung Data Tier 6
G Hibernate mehrere @oneToone Data Tier 2

Ähnliche Java Themen


Oben