2016-08-19 6 views
0

ich Hibernate lerne und ein wenig mit dem unten Problem steckenversuchen, zu verstehen, wie @JoinTable und @JoinColumn arbeitet

haben zwei Tabellen

CREATE TABLE department (
department_id int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY, 
caption varchar(255) DEFAULT NULL) ENGINE=InnoDB; 
CREATE TABLE employee (
employee_id int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY, 
fio varchar(255) DEFAULT NULL, 
fk_department_id int(11) NOT NULL, 
FOREIGN KEY (fk_department_id) REFERENCES department (department_id) 
) ENGINE=InnoDB ; 

und zwei Klassen (in der ersten Klasse auf Kommentar Code sieht aus wie Arbeitslösung)

@Entity 
@Table(name = "department") 
public class Department { 
.... 
    @OneToMany(cascade = CascadeType.ALL) 
    @JoinTable(name = "employee", joinColumns = { 
      @JoinColumn(name = "fk_department_id", referencedColumnName = "department_id") }) 
    /* 
    * @OneToMany(fetch = FetchType.LAZY, mappedBy = "department", cascade = 
    * CascadeType.ALL) 
    */ 
    public Set<Employee> getEmployies() { 
     return employees; 
    } 

@Entity 
@Table(name = "employee") 
public class Employee { 
...... 
    @ManyToOne 
    @JoinColumn(name = "fk_department_id") 
    public Department getDepartment() { 
     return department; 
    } 

dies führt in

INFO: HHH000423: Disabling contextual LOB creation as JDBC driver reported JDBC version [3] less than 4 
Exception in thread "main" org.hibernate.MappingException: Foreign key (FK3cspe1b06hmsik5l8y1i11xmd:employee [employies_employee_id])) must have same number of columns as the referenced primary key (employee [fk_department_id,employies_employee_id]) 
    at org.hibernate.mapping.ForeignKey.alignColumns(ForeignKey.java:148) 
    at org.hibernate.mapping.ForeignKey.alignColumns(ForeignKey.java:130) 

Bitte helfen Sie mir zu verstehen, warum dies nicht

funktioniert

Antwort

0

Folgendes sollte gut funktionieren. Sie werden feststellen, dass ich keine Join-Spaltenbeziehungen angeben, da ich zulassen kann, dass Hibernate diese automatisch für mich generiert.

Aber nehmen wir an, Sie möchten explizit über die Join-Spalten.

@Entity 
public class Department { 
    @Id 
    @Column(name = "department_id") 
    private Integer id; 
    @OneToMany 
    @JoinTable(
    name = "department_employees", 
    joinColumns = @JoinColumn(name = "department_id"), 
    inverseJoinColumns = @JoinColumn(name = "employee_id")) 
    private List<Employee> employees; 
} 

@Entity 
public class Employee { 
    @Id 
    @Column(name = "employee_id") 
    private Integer id; 
    @ManyToOne 
    @JoinTable(
    name = "department_employees", 
    joinColumns = @JoinColumn(name = "department_id", insertable = false, updatable = false), 
    inverseJoinColumns = @JoinColumn(name = "employee_id", insertable = false, updatable = false)) 
    private Department department; 
} 

Die wichtigsten Punkte von diesem wegzunehmen sind:

  • Der Name der Join-Tabelle gibt die mittlere Tabelle, die die Beziehung zwischen den Department und Employee Einheiten unterhält. Es sollte sich nicht auf die Employee Tabelle beziehen, wie Ihr Code zeigt.
  • Das joinColumns Attribut repräsentiert die Primärschlüsselattribute der enthaltenden Entität, in diesem Fall ist das Department, daher habe ich department_id verwendet.
  • Das inverseColumns Attribut repräsentiert die Primärschlüsselattribute der zugehörigen Entität, in diesem Fall ist das Employee, daher habe ich employee_id verwendet.

Update:

Wenn Sie möchten, dass die @JoinTable beseitigen und lediglich die Beziehung zwischen Department und Employee halten, dann würden Sie Ihre Zuordnungen wie folgt ändern:

@Entity 
public class Department { 
    @OneToMany(mappedBy = "department") 
    private List<Employee> employees; 
} 

@Entity 
public class Employee { 
    @ManyToOne 
    private Department department; 
} 

Hoffnung, die hilft .

+0

Danke Naros für die Antwort, in meinem Fall habe ich keine mittlere Tabelle, ich habe nur 2 Tabellen –

+0

Es klingt für mich, als ob Sie nicht ein JoinTable dann wollen. Sie könnten die OneToMany und ManyToOne ohne eine JoinTable leicht zuordnen, wenn Sie dann möchten. Wird per Post aktualisiert, um das Beziehungsmapping ohne JoinTable einzuschließen. – Naros

+0

Verstehe ich richtig, dass JoinTable mit JoinColumn funktioniert, wenn ich 3 Tabellen habe? –

Verwandte Themen