2016-03-18 4 views
1

Ich bin ziemlich neu zu JPA/Hibernate. Ich versuche herauszufinden, wie man zwei Tabellen mit zusammengesetzten Schlüsseln und keiner echten Datenbankbeziehung am besten verbinden kann.Hibernate/JPA Join zwei Tabellen mit zusammengesetzten Tasten (keine ausländische Beziehung)

enter image description here

@Embeddable 
public class StepPK implements Serializable{ 
    @Column(name = "step_id") 
    protected String stepId; 

    @Column(name = "packet_id") 
    protected String packetId; 
    ... 
} 


@Entity 
@Table(name = "step_def") 
@IdClass(StepPK.class) 
public class InprocessPacketStep implements Serializable{ 

    @Id 
    private String stepId; 

    @Id 
    private String packetId; 

} 


@Embeddable 
public class StepDetailPK implements Serializable { 
    @Column(name = "step_id") 
    protected String stepId; 

    @Column(name = "packet_id") 
    protected String packetId; 

    @Column(name="user_id") 
    protected String userId; 

    @Column(name="parallel_step_id") 
    protected String parallelId; 
    ... 
} 

@Entity 
@Table(name = "step_detail") 
@IdClass(StepDetailPK.class) 
public class InprocessPacketStepDetail implements Serializable { 

    @Id 
    private String stepId; 

    @Id 
    private String packetId; 

    @Id 
    private String parallelId; 

    @Id 
    private String userId; 
} 

Was ich bisher haben funktioniert gut, wenn sie einzeln Informationen aus den Tabellen ziehen, aber ich brauche eine Möglichkeit, sie auf dem step_id beizutreten. Da es wirklich keine zugewiesene Beziehung gibt, scheint die Ausführung von OneToMany und JoinColumns nicht zu funktionieren.

Ich habe versucht, eine ManyToMany zu verwenden, und es explodiert nicht beim Kompilieren, aber bei der Überprüfung meiner Tests verursacht es eine SQLGrammar-Ausnahme.

Mein einziger anderer Gedanke ist, sie manuell durch eine Abfrage zu verbinden, aber die Ausführung von entityManager.createQuery("select InprocessPacketStep step join inprocessPacketStepDetail d on d.stepId = step.stepId") verursacht einen Laufzeitfehler.

Jeder Vorschlag wäre willkommen. Ich habe ziemlich viel gegoogelt und verschiedene Dinge ausprobiert, die ich ohne Erfolg gefunden habe.

+0

Oh, die ima Ge Link an der Spitze ist grundlegende Tabelle Beschreibung – Jerron

+0

Weitere Informationen zu den aufgetretenen Fehler bitte. Welche Ausgabe willst du auch bekommen? –

+0

Warum können Sie keine zusätzliche relationale Tabelle verwenden? Was ist die Beziehung zwischen diesen Entitäten? – Cootri

Antwort

0

Wenn Ihr Datenbankschema nicht ein Erbe ist und Sie können es ändern, dann @ManyToMany Verbindung mit zusätzlichen Beziehungstabelle sollte es tun: enter image description here

Es gibt viele examples im Web für populäre JPA 2 .x Umsetzungsrahmen (einschließlich Hibernate natürlich)

Andernfalls sollten Sie Lösung aus diesem Thread versuchen: @ManyToMany without join table (legacy database)