美文网首页
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 属性忽略,他的默认引用就是对应表的主键值。

相关文章

  • SSM框架的常用注解整理

    一.mybatis 1 配置一对多查询和多对多查询的注解方式映射关系: @Results:声明映射关系的配置 Va...

  • Hibernate 一对多操作

    一 表与表之间关系回顾 一对多 多对多 一对一 二 hibernate一对多操作1 一对多映射配置以客户联系人为列...

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

    以视频种类与视频举例: 当我们只添加@OneToMany与@ManyToOne注解时,此时运行增删改查hibern...

  • HIbernate多对多关系映射(注解配置)

    以视频信息与用户关系为例:一个用户可以拥有多个视频,一个视频也可以同时被多个用户所拥有。

  • Java:hibernate框架(3)

    一. 表与表之间的关系 二.Hibernate的一对多操作1.一对多映射配置 2.一对多级联保存 3.一对多的级联...

  • Hibernate-Annotation

    课程地址 使用hibernate注解的目的 为了简化ORM映射文件(*.hbm)繁琐的配置。注解需要做的是映射文件...

  • Hiberbate关系映射

    作为一种轻量级的关系映射工具,Hibernate支持各种关系映射,例如:多对一、一对多和一对一的数据库表关系,通过...

  • Hibernate—— 注解

    类级别注解 1、使用注解的目的:为了简化繁琐的ORM映射文件(*.hbm)的配置 2、JPA与Hibernate的...

  • Hibernate—— 注解

    类级别注解 1、使用注解的目的:为了简化繁琐的ORM映射文件(*.hbm)的配置 2、JPA与Hibernate的...

  • Hibernate 一对多配置(注解)

    商品与评论关系的一对多 表结构设计 t_goods: t_comment: 商品(一的一方) 商品的评论(多的一方)

网友评论

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

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