2017-03-16 1 views
1

zur Karte habe ich zwei Tabellen: Bericht und flyleaf. Ein Bericht wird durch eine 'ID' und einen 'Index' identifiziert, die Fremd- und Primärschlüssel in der Vorblendtabelle sind.Hibernate Annotations 00.59 unidirektionale Verbindung mit zusammengesetzten Primärschlüssel

Das Schema der Tabellen sind:

CREATE TABLE `report` (
    `id` int(11) NOT NULL, 
    `index` varchar(5) NOT NULL, 
    `nb_page` int(11) DEFAULT NULL 
); 
ALTER TABLE `report` ADD PRIMARY KEY (`id`,`index`); 

CREATE TABLE `flyleaf_t` (
    `id` int(11) NOT NULL, 
    `index` varchar(5) NOT NULL, 
    `title` varchar(30) DEFAULT NULL, 
    `author` varchar(30) DEFAULT NULL, 
    `checker` varchar(30) DEFAULT NULL 
); 
ALTER TABLE `flyleaf` ADD PRIMARY KEY (`id`,`index`); 
ALTER TABLE `flyleaf` ADD CONSTRAINT `flyleaf_ibfk_1` FOREIGN KEY (`id`,`index`) REFERENCES `report` (`id`, `index`); 

Ich benutze Hibernate Annotations diese Assoziation in unidirektionale Weise abzubilden. Wenn ich eine einfache Taste (nicht zusammengesetzt), es funktioniert gut natürlich, aber wenn ich versuche, ein „org.hibernate.TypeMismatchException“ zusammengesetzten Schlüssel verwenden wird mit der Meldung ausgelöst: „id vom falschen Typ für die Klasse lgmi_cr.Flyleaf bereitgestellt. Erwartet: Klasse lgmi_cr.Flyleaf, Klasse lgmi_cr.Report "

Wenn jemand bereits den gleichen Fall gesehen hat oder eine Vorstellung davon hat, wie man diese Assoziation in unidirektionaler Eins-zu-Eins-Weise darstellt, wird seine Hilfe geschätzt.

EDIT: Dies ist, wie Id die Zuordnung

@Entity 
@Table(name="report") 
public class Report implements Serializable{ 

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

    @Id 
    @Column(name = "index") 
    private String index; 

    @OneToOne 
    @JoinColumns({@JoinColumn(name="id", referencedColumnName="id"), 
      @JoinColumn(name="index", referencedColumnName="index")}) 
    private Flyleaf flyleaf; 
... 

@Entity 
@Table(name="flyleaf") 
public class Flyleaf implements Serializable { 

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

    @Id 
    @Column(name = "index") 
    private String index; 
.... 

tat Und ich habe diese Ausnahme „org.hibernate.TypeMismatchException. Vorausgesetzt ID vom falschen Typ für die Klasse lgmi_cr.Flyleaf Erwartet: Klasse lgmi_cr .Flyleaf, bekam Klasse lgmi_cr.Report“

Antwort

1

ich wünsche Ihnen könnte teilen, wie Sie diese Beziehungen in Hibernate kartieren? Dies ist, wie ich es tun würde:

1) Karte jede zusammengesetzte Tabelle als separates Klassenobjekt @Embeddable Anmerkung, zB:

@Embeddable 
public class ReportPK implements Serializable { 

    @Basic(optional = false) 
    @Column(name="id") 
    private int id; 
    @Basic(optional = false) 
    @Column(name="index") 
    private String index; 
... 

Und die Entity-Klasse aussehen würde:

@Table(name="report") 
public class Report implements Serializable { 

    @EmbeddedId 
    protected ReportPK id; 
... 

@OneToOne 
    @JoinColumns({ 
    @JoinColumn(name="id", 
     referencedColumnName="id"), 
    @JoinColumn(name="index", 
     referencedColumnName="index"), 
    }) 
    private Report report; 
... 

Vielleicht:

2) In der flyleaf Entity-Klasse können Sie das unidirektionale Mapping als hinzufügen Sie können genauer sein, wenn dies nicht hilft. Danke :-)

+0

für Ihre Hilfe @nkmuturi. Ihre Lösung funktioniert und ich invertiere die unidirektionale Zuordnung (map ein Vorsatzblatt in einem Bericht). Würden Sie bitte mehr Details über den Code und den verwendeten Mechanismus geben (ich bin neu mit Hibernate)? –

+0

Die ID-Annotation wird für die Zuordnung zu Tabellen verwendet, die einen einzelnen Primärschlüssel enthalten. Bei Tabellen mit zusammengesetzten Primärschlüsseln werden jedoch IdClass oder Embeddable verwendet. Sehen Sie weitere Erklärung hier http://www.objectdb.com/java/jpa/entity und dieses ebook http://www.ebooks.com/602765/beginning-hibernate/linwood-jeff-minter-dave/ für noch mehr. – nkmuturi

+0

Ich habe gerade angefangen, dieses Buch zu lesen, und ich finde es sehr interessant. Ich habe nur eine weitere Frage, mit diesen Anmerkungen, wenn ich einen Bericht entferne, wird das zugehörige Vorsatzblatt automatisch entfernt oder ich muss einige Kaskadenparameter hinzufügen? Mit Ihrer Antwort denke ich, dass die Frage beantwortet wird. –

Verwandte Themen