2016-07-08 12 views
3

Erstellung habe ich Klassen:Hibernate - Klassen von Schema

@Table(name = "FILE_SET") 
@Entity 
public class FileSet 
{ 
    @Id 
    @Column(name = "FileSetId") 
    private final long fileSetId; 

    @Column(name = "FileSetState") 
    private final int fileSetState; 

    @OneToMany(targetEntity = Variables.class) 
    private final Set<Variables> variables; 
} 

und

@Entity 
@Table(name = "VARIABLES") 
public class Variables 
{ 
    @Id 
    @Column(name = "VariablesId") 
    private final int variablesId; 

    @ManyToOne(targetEntity = FileSet.class) 
    @JoinColumn(name = "CurrentFileSetId") 
    private final long currentFileSetId; 

    @Column(name = "CurrentDevicesDictId") 
    private final long currentDevicesDictId; 
} 

Und dieser Code Kistenverpackungen Tabellen: https://zapodaj.net/b18d0afb396e5.png.html

Aber ich wollte nur "Variablen" haben und "FileSet", wobei CurrentFileSetId in Variablen der Fremdschlüssel von FileSet ist. Was mache ich falsch? Ich benutze den ersten Ruhezustand.

Antwort

2

In OneToMany Seite hinzufügen @JoinColumn(name = "CurrentFileSetId")

@OneToMany(targetEntity = Variables.class) 
@JoinColumn(name = "CurrentFileSetId") 
private final Set<Variables> variables; 

so stattdessen eine JoinTable schaffen wird es eine FK erstellen.

Die obige Antwort gilt für eine unidirektionale Zuordnung.

So ist die Antwort vollständig zu machen, ist, dass im Fall einer bidirektionalen Assoziation nach sollte der Code sein:

@ManyToOne(targetEntity = FileSet.class) 
@JoinColumn(name = "CurrentFileSetId") 
private final long currentFileSetId; 

and 

@OneToMany(targetEntity = Variables.class, mappedBy = "currentFileSetId") //this is the field name in FileSet class. 
private final Set<Variables> variables; 

Also im Grunde die Anmerkung @JoinColumn zeigt an, dass diese Einheit die Besitzer der Beziehung ist. Während wir in mappedBy das Feld angeben, das die Beziehung besitzt.

+0

Der Fremdschlüsselspalt Name ist 'CurrentFileSetId'. –

+0

@ v.ladynev korrigiert! – eatSleepCode

1

Ich denke, dass @ EatSleepCode die richtige Antwort ist. Aber ich möchte einen häufigeren Hibernate-Ansatz einführen.

Sie sollten nie eindeutige Fremdschlüsselfelder wie currentFileSetId verwenden - stattdessen Assoziationen zu Entitäten verwenden. Und Sie müssen targetEntity = Variables.class nicht verwenden, Hibernate verwendet es als Standard.

@Table(name = "FILE_SET") 
@Entity 
public class FileSet 
{ 
    @Id 
    @Column(name = "FileSetId") 
    private final long fileSetId; 

    @Column(name = "FileSetState") 
    private final int fileSetState; 

    @OneToMany(mappedBy = "currentFileSet") 
    private final Set<Variables> variables; 

} 

@Entity 
@Table(name = "VARIABLES") 
public class Variables 
{ 
    @Id 
    @Column(name = "VariablesId") 
    private final int variablesId; 

    @ManyToOne(fetch = FetchType.LAZY) 
    @JoinColumn(name = "CurrentFileSetId") 
    private FileSet currentFileSet; 

} 

Wenn Sie nicht wollen, Verein FileSet auf dem Variables Teil haben (noch CurrentFileSetId als Fremdschlüssel hat):

@Table(name = "FILE_SET") 
@Entity 
public class FileSet 
{ 
    @Id 
    @Column(name = "FileSetId") 
    private final long fileSetId; 

    @Column(name = "FileSetState") 
    private final int fileSetState; 

    @OneToMany 
    @JoinColumn(name = "CurrentFileSetId") 
    private final Set<Variables> variables; 

} 

@Entity 
@Table(name = "VARIABLES") 
public class Variables 
{ 
    @Id 
    @Column(name = "VariablesId") 
    private final int variablesId; 

} 
+0

danke, jetzt verstehe ich, aber warum verwenden Sie FetchType faul? Wird das gebraucht? – pustypawel

+0

@pustypawel Standardmäßig wird Hibernate vollständig "FileSet" abgerufen, während Sie 'Variablen' erhalten. Hibernate wird es natürlich von einem Session-First-Level-Cache bekommen. Aber wir verwenden einen solchen "alles faulen" Ansatz in unseren Projekten, um nicht viele Daten zufällig zu bekommen. Und Sie müssen 'FileSet' mit' Variablen' in den seltensten Situationen geladen haben, wie ich denke. –

Verwandte Themen