2016-05-07 6 views
0

Ich habe zwei Tage lang meinen Kopf auf meiner Tastatur wurde bashing versuchen, das herauszufinden ...Hibernate unidirektional OneToMany funktioniert nicht mit Composite-ID

Einige Hintergrundinformationen: Wir haben ein Datenmodell mit einem Perl-Code einrichten Basis, die direkte native SQL-Anweisungen über ODBC zur Datenbank führt. Aus bestimmten Gründen haben wir beschlossen, den Code in Java neu zu schreiben ... Ich dachte, es wäre eine gute Idee, Hibernate zu verwenden, um alle Zuordnungen zu definieren. Wir möchten das Datenmodell nicht bearbeiten.

Der Einfachheit halber kann ich das Problem nur mit einem Teil unseres Datenmodells ausdrücken. Wir haben die Entitäten "Job", "JobDatabase" und "JobTable".

Job hat eine PK von job_name. Die Datenbank hat eine PK mit job_name, name. Tabelle hat eine PK von job_name, src_database_name, name. Wie zu erwarten, hat Job eine OneToMany-Beziehung mit JobDatabase und Database eine OneToMany mit JobTable.

Für diesen Test beginne ich mit leeren Tabellen und versuche, einige Beispieldaten zu erstellen. Ich kann einen Job und eine JobDatabase einfügen, aber wenn ich versuche, JobTable einzufügen, gibt Hibernate einen Fehler aus. Oder genauer, das ist wo es sich beschwert. Es beginnt nicht, meinen Code auszuführen, da es den Zuordnungsfehler erkennt. Wenn ich jedoch die Verknüpfung zwischen JobDatabase und JobTable lösche, fügt sie alle Job- und JobDatabase-Datensätze korrekt ohne Fehler ein.

Beispielklassen (alle Felder haben Getter/Setter ... es gibt auch viele andere Felder):

@Entity 
@Table(name="Job") 
public class Job implements Serializable { 
    @Id 
    @Column(name="job_name",nullable = false) 
    private String jobName; 

    @OneToMany(cascade = CascadeType.ALL) 
    @JoinColumn(name = "job_name", referencedColumnName = "job_name") 
    private Set<JobDatabase> databases; 
} 

@Entity 
@Table(name="JobDatabase") 
public class JobDatabase implements Serializable { 
    @Id 
    @Column(name="job_name",nullable = false) 
    private String jobName; 

    @Id 
    @Column(name="name",nullable = false) 
    private String name; 

    @OneToMany(cascade = CascadeType.ALL) 
    @JoinColumns({ 
      @JoinColumn(name = "job_name", referencedColumnName = "job_name"), 
      @JoinColumn(name = "name", referencedColumnName = "src_database_name") 
    }) 
    private Set<JobTable> tables; 
} 

@Entity 
@Table(name="JobTable") 
public class JobTable implements Serializable{ 
    @Id 
    @Column(name="job_name",nullable = false) 
    private String jobName; 

    @Id 
    @Column(name="src_database_name",nullable = false) 
    private String srcDatabaseName; 

    @Id 
    @Column(name="name",nullable = false) 
    private String name; 
} 

Der Fehler:

Exception in thread "main" org.hibernate.MappingException: Unable to find column with logical name: src_database_name in JobDatabase 

ich diesen Fehler erhalte. Ich verstehe nicht, warum es nach der referenzierten Spalte in der Entität sucht, die das Mapping "besitzt". src_database_name existiert tatsächlich nur in JobTable - in JobDatabase wird er als "name" bezeichnet. JobTable hat auch ein "name" -Feld, aber es bezieht sich auf den Namen der Tabelle.

Antwort

0

Sie müssen die Spalte src_database_name in Ihrer JobDatabase-Tabelle haben. Oder Sie können src_database_name in einen anderen Spaltennamen ändern.

Für den zusammengesetzten Schlüssel muss die Referenzspalte in Ihrer Quelltabelle vorhanden sein.