2017-02-06 4 views
0

Also in diesem Beispiel Szenario habe ich eine Anwesenheit DTO, und ein Arbeiter DTO, Arbeiter in diesem Zusammenhang sind nach Abteilung getrennt, und ein Arbeiter kann immer nur innerhalb einer Abteilung sein. Es ist wichtig zu beachten, dass sich Worker {id='123-123-123', department='a'} von Worker {id='123-123-123', department='b'} unterscheidet, obwohl beide die gleiche Id teilen.Hibernate: wiederholte Spalte in Mapping

Ich habe die folgende Klasse Setup und separate Funktionen zu versuchen, durch id und department

public class IdAndDepartmentPK implements Serializable { 

    private String id; 
    private String department; 

    public IdAndDepartmentPK() {} 
    ... 
} 

Diese Schlüsselklasse zwischen DTOs geteilt wird erfordern, dass sowohl die Worker ‚s id und department, unter den beiden DTOs sind, dass verursachen ein Problem.

@Entity 
@IdClass(IdAndDepartmentPK.class) 
public class AttendencetDto { 

    @Id private String id; // This is a departmentally unique attendenceId 
    @Id private String department; 
    @Column private String workerId; 

    @JoinColumns({ 
     @JoinColumn(name = "workerId"), 
     @JoinColumn(name = "department") 
    }) 
    @ManyToOne(fetch = FetchType.EAGER) 
    private WorkerDto workerDto; 
    .... 
} 

@Entity 
@IdClass(IdAndDepartmentPK.class) 
public class WorkerDto { 

    @Id 
    private String id; 

    @Id 
    private String department; 
    ... 
} 

WorkerDto benötigt keine Kenntnisse von AttendencetDto zu haben, aber AttendencetDto, muss Zugang zu WorkerDto haben und die anderen Daten, die er enthält.

Hibernate beschwert sich, dass Felder wie workerId mit insert = "false" update = "false" zugeordnet werden sollten, aber wenn ich dies tun würde, wäre ich nicht in der Lage, diese Werte in der Datenbank zu erhalten.

Ich möchte im Wesentlichen diese Felder verfügbar haben, während auch die WorkerDto zur Verfügung steht, ist das möglich?

+1

Warum brauchen Sie '@Column private String workerId;'? Sie können Ihre Entität mit workerDto verknüpfen. – ByeBye

+0

Aber wenn ich zum Beispiel die Tabelle 'attention' mit der Spalte 'worker_id' habe, würde Hibernate die Daten dort einfügen, ohne dass ich diese Spalte im dto spezifiziere? – Dominic

+0

Wenn es eine Verbindung zu einem Fremdschlüssel gibt, können Sie einfach 'workerDto' einstellen und nach dem Schließen der Transaktion werden Ihre Entitäten verknüpft. – ByeBye

Antwort

1

Sie sollten @Column private String workerId; entfernen, da Sie es bereits durch Relation zu WorkerDto zuordnen.

Wenn Sie Beziehung erstellen möchten, sollten Sie setWorkerDto Methode in Ihrem AttendencetDto verwenden und einfach speichern. Nach dem Ende der Transaktion haben Sie Ihre Beziehung in der DB.

+0

Akzeptieren dieser Antwort, weil es die richtige Auflösung! – Dominic