美文网首页
Hibernate一对多关系映射(注解配置)

Hibernate一对多关系映射(注解配置)

作者: 游牧族人 | 来源:发表于2018-05-22 09:29 被阅读22次

    以视频种类与视频举例:

    视频种类实体类(一):
    @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 属性忽略,他的默认引用就是对应表的主键值。

    相关文章

      网友评论

          本文标题:Hibernate一对多关系映射(注解配置)

          本文链接:https://www.haomeiwen.com/subject/agcfjftx.html