2016-07-08 70 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'。 –