2016-07-08 168 views
3

創建類我創建的類:休眠 - 從模式

@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; 
} 

@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; 
} 

而這種代碼是裝箱表: https://zapodaj.net/b18d0afb396e5.png.html

,但我想只有 「變量」和「FileSet」,其中變量中的CurrentFileSetId是來自FileSet的外鍵。我究竟做錯了什麼?我第一次使用hibernate。

回答

2

OneToMany側添加@JoinColumn(name = "CurrentFileSetId")

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

因此而不是創建一個JoinTable它將創建一個FK的。

以上答案適用於單向關聯。

因此,爲了使答案完整的,也就是說在雙向關聯的情況下,應按如下代碼:

@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; 

所以基本上,註釋@JoinColumn表明,該實體是關係的所有者。而在mappedBy中,我們提供擁有該關係的字段。

+0

外鍵列名是'CurrentFileSetId'。 –

+0

@ v.ladynev糾正! – eatSleepCode

1

我想,@ eatSleepCode的答案是正確的。但我想介紹一種更常見的Hibernate方法。

您不應該使用簡單的外鍵字段,如currentFileSetId - 而是使用關聯到實體。你不需要使用targetEntity = Variables.class,Hibernate使用它作爲默認值。

@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; 

} 

如果您不希望有關聯FileSetVariables部分(仍然有CurrentFileSetId作爲外鍵):

@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

謝謝,現在我明白了,但你爲什麼使用FetchType懶惰?這是需要的嗎? – pustypawel

+0

@pustypawel默認情況下當你獲得'變量'時,Hibernate將完全獲取'FileSet'。當然,Hibernate會從會話第一級緩存中獲取它。但是我們在我們的項目中使用了這種「一切懶惰的方法」,以避免偶然獲得大量數據。就像我想的那樣,你將需要在很少的情況下用'Variables'加載'FileSet'。 –