以视频种类与视频举例:
视频种类实体类(一):
@Entity
@Table(name = "video_kinds")
public class Kind implements Serializable {
private int kind_id;
private String kind_name;
private Set<Video> videos = new HashSet<>();
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
public int getKind_id(){}
public void setKind_id(int kind_id){}
public String getKind_name(){}
public void setKind_name(String kind_name){}
@OneToMany(cascade = CascadeType.ALL)
public Set<Video> getVideos(){}
public void setVideos(Set<Video> videos){}
}
视频实体类(多):
@Entity
@Table(name = "videos")
public class Video {
private int video_id;
private String video_name;
private Kind video_kind;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
public int getVideo_id(){}
public void setVideo_id(int video_id){}
public String getVideo_name(){}
public void setVideo_name(String video_name){}
@ManyToOne(cascade = CascadeType.ALL)
public Kind getVideo_kind(){}
public void setVideo_kind(Kind video_kind){}
}
当我们只添加@OneToMany与@ManyToOne注解时,此时运行增删改查hibernate会自动帮你建立一个表,里面存放着Kind与Video的主键映射关系,通过这个表来进行一对多和多对一的增删改查操作(但是我没测试成功,每次运行的时候hibernate确实帮我建表了,但是查询的时候有会报异常,异常信息是中间生成的表不存在???emmm还不知道为什么)。
一定要设置合适的cascade属性,因为默认的cascade为none,此时没有级联关系,你的数据库操作可能会因为hibernate设立关系映射时建立的外键约束而失败。
当我们为关系映射设立字段名称时,hibernate就不会再为我们建立临时中间表。
为关系映射建立字段名称是如下操作:
视频种类实体类(一):
@Entity
@Table(name = "video_kinds")
public class Kind implements Serializable {
private int kind_id;
private String kind_name;
private Set<Video> videos = new HashSet<>();
......
@OneToMany(cascade = CascadeType.ALL,mappedBy = "video_kind")
public Set<Video> getVideos(){}
public void setVideos(Set<Video> videos){}
}
视频实体类(多):
@Entity
@Table(name = "videos")
public class Video {
private int video_id;
private String video_name;
private Kind video_kind;
......
@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "video_kind",referencedColumnName = "kind_id")
public Kind getVideo_kind(){}
public void setVideo_kind(Kind video_kind){}
}
可以发现我们并没有为Kind中的videos集合添加任何字段,因为他本来就不需要任何字段,我们只需要通过视频种类找到视频即可,所以我们将维护关系放到Video一方,如果不添加mappedBy属性,那么双方都要维护表之间的关系,这样会使我们进行数据库操作发生异常。一定不要想为Kind类的@OneToMany关系添加一个@JoinColumn,因为我们并不需要这个额外的字段。
对于视频实体类,他拥有一个Kind类型,那是video表与video_kinds表的映射关系,在@ManyToOne注解下我们添加了@JoinColumn注解,并且将他的name属性(当前字段名称)指定为video_kind,referencedColumnName属性值为参照引用的字段名称,所以这个注解的含义就是我们的video_kind值将引用Kind类中的kind_id作为外键关联。
这里由于video_kind引用的是kind_id(主键值),所以这里我们可以把referencedColumnName 属性忽略,他的默认引用就是对应表的主键值。
网友评论