hibernate实体配置关系映射&延迟加载

Posted 海上小波

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hibernate实体配置关系映射&延迟加载相关的知识,希望对你有一定的参考价值。

概述

       一个实体里面是可以配置多个映射关系的,也就是说同一个实体里面既能够配置@OneToMany同时也可以存在@ManyToOne(这条是废话,直接略过即可);

       映射关系配置时@JoinColumn的配置十分关键,一般只要配置name和referencedColumnName两个属性,前面一个对应本表的外建列名,后面一个对应关系表中的主键列名;

       在配置@OneToMany关系映射的时候,@OneToMany里面除了加targetEntity外还要加入fetch属性,fetch是用于配置该Set<>集合是否延迟加载的,如果不配置默认情况下fetch的值为FetchType.Lazy,也就是延迟加载,这里要配置成立即加载FetchType.EAGER,不然会报下面这个异常,记住一点集合属性要立即加载,不然之后可能出异常

      

      


案例

这里以菜单的案例来做例子,菜单数据库表中每个字段都存有父表的id,如果要取到指定id的菜单的父表和子表集合怎么配置呢,如下:

package com.sunsharing.po;


import javax.persistence.*;
import java.util.HashSet;
import java.util.Set;

/**
 * Created by bozutung on 3/28/16.
 */
@Entity
@Table(name = "t_menu")
public class Menu 
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;
    private String lable;
    private String url;
    @ManyToOne(targetEntity = Menu.class)
    @JoinColumn(name = "superMenu", referencedColumnName = "id")
    private Menu superMenu;
    private Integer type;
    private String note;
    @OneToMany(targetEntity = Menu.class, fetch = FetchType.EAGER)
    @JoinColumn(name = "superMenu", referencedColumnName = "id")
    private Set<Menu> subMenus = new HashSet<Menu>();
    public Integer getId() 
        return id;
    

    public void setId(Integer id) 
        this.id = id;
    

    public String getLable() 
        return lable;
    

    public void setLable(String lable) 
        this.lable = lable;
    

    public String getUrl() 
        return url;
    

    public void setUrl(String url) 
        this.url = url;
    

    public Menu getSuperMenu() 
        return superMenu;
    

    public void setSuperMenu(Menu superMenu) 
        this.superMenu = superMenu;
    

    public Integer getType() 
        return type;
    

    public void setType(Integer type) 
        this.type = type;
    

    public String getNote() 
        return note;
    

    public void setNote(String note) 
        this.note = note;
    

    public Set<Menu> getSubMenus() 
        return subMenus;
    

    public void setSubMenus(Set<Menu> subMenus) 
        this.subMenus = subMenus;
    


注意:这里千万不要傻傻的用idea或者eclipse集成的自动生成toString的功能 重写实体类的方法,这样会stackoverflow的,打印子菜单和父菜单,然后子菜单又有父菜单(就是菜单自身),这样就出现死循环了,而且循环越来越多。



以上是关于hibernate实体配置关系映射&延迟加载的主要内容,如果未能解决你的问题,请参考以下文章

Hibernate 的七种映射关系

2018.10.6 Hibernate配置文件详解-------ORM元数据配置 &&& hibernate主配置文件

Hibernate框架学习之注解配置关系映射

Hibernate延迟加载机制

Hibernate多表关系配置——多对多对关系映射

《Java从入门到放弃》入门篇:使用注解的方式配置hibernate映射关系