Hibernate入门到开发五之复杂属性的映射

一、介绍表关联的三种结构
这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

二、关联表的注解【截图,表格不好贴出来,下载我的资料呗】
这里写图片描述

三、演示案例如下
1)OneToOne 一对一的映射

@Entity
@Table(name="t_herat")
public class Heart {
    private Long id;
    private String code;

    private Body body;

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    public Long getId() {
        return id;
    }
    public String getCode() {
        return code;
    }
    // mappeBy表示“放弃维护主键,这一方不生成主键。在表结构中,单方向就可以”
    @OneToOne(mappedBy="heart")
    public Body getBody() {
        return body;
    }

    public void setId(Long id) {
        this.id = id;
    }
    public void setCode(String code) {
        this.code = code;
    }

    public void setBody(Body body) {
        this.body = body;
    }
}
@Entity
@Table(name="t_body")
public class Body 
{
    private Long id;
    private String code;

    //一 对 一 关 联  
    private Heart heart;

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    public Long getId() {
        return id;
    }
    public String getCode() {
        return code;
    }

    @OneToOne(cascade=CascadeType.ALL)//,fetch=FetchType.LAZY 默认为LAZY
//  @PrimaryKeyJoinColumn //主键关联
//  @JoinColumn//默认 关联外键
//  @JoinTable(  //引用第三方的表进行关联
//          name="tr_body_heart",
//          joinColumns=@JoinColumn(name="body_id"),
//          inverseJoinColumns = @JoinColumn(name="heart_id")
//  )
    public Heart getHeart() {
        return heart;
    }
    public void setId(Long id) {
        this.id = id;
    }
    public void setCode(String code) {
        this.code = code;
    }
    public void setHeart(Heart heart) {
        this.heart = heart;
    }
}

演示结果如下:
1.1 如果是:@JoinColumn//默认 关联外键
这里写图片描述
1.2  如果是:@PrimaryKeyJoinColumn
这里写图片描述
1.3  如果是:@ JoinTable
这里写图片描述
1.4  如果是:没有添加 mappedBy=”heart”
所以在从端,一定要放弃一个外键

这里写图片描述
2)ManyToOne 或者OneToMany
有了第一个例子之后,第二个例子就简单多了。

@Entity
@Table(name="t_flight")
public class Flight {
    private Long id;
    private String description;
    private Company company;


    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    public Long getId() {
        return id;
    }

    public String getDescription() {
        return description;
    }
    @ManyToOne(cascade=CascadeType.ALL)
    @JoinColumn
    public Company getCompany() {
        return company;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public void setCompany(Company company) {
        this.company = company;
    }

    @Override
    public String toString() {
        return "Flight [id=" + id + ", description=" + description + "]";
    }
}
@Entity
@Table(name="t_company")
public class Company {
    private Long id;
    private String name;

    private List<Flight> flightList= new ArrayList<Flight>();

    public Company() {

    }

    public Company(Long id, String name) {
        super();
        this.id = id;
        this.name = name;
    }
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    public Long getId() {
        return id;
    }
    public String getName() {
        return name;
    }
    @OneToMany(mappedBy="company")
    public List<Flight> getFlightList() {
        return flightList;
    }

    public void setId(Long id) {
        this.id = id;
    }
    public void setName(String name) {
        this.name = name;
    }
    public void setFlightList(List<Flight> flightList) {
        this.flightList = flightList;
    }


    @Override
    public String toString() {
        return "Company [id=" + id + ", name=" + name + ", flightList=" + flightList + "]";
    }


}

演示结果如下:
2.1 如果是:@JoinColumn//默认 关联外键
这里写图片描述
2.2  如果是:@ JoinTable
没有意义,用第三方表维护,有兴趣的可以试一下
如果是:没有添加 mappedBy=”heart”
不可以,双向关联,gg

3)ManyToMany

@Entity
@Table(name="t_a")
public class ManyA {
    private Long id;
    private String name;
    private List<ManyB> manyAList = new ArrayList<ManyB>();
    public ManyA() {

    }
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    public Long getId() {
        return id;
    }
    public String getName() {
        return name;
    }
    @ManyToMany(mappedBy="manyAList")
    public List<ManyB> getManyAList() {
        return manyAList;
    }
    public void setId(Long id) {
        this.id = id;
    }
    public void setName(String name) {
        this.name = name;
    }
    public void setManyAList(List<ManyB> manyAList) {
        this.manyAList = manyAList;
    }



}
@Entity
@Table(name="t_b")
public class ManyB {
    private Long id;
    private String name;
    private List<ManyA> manyAList = new ArrayList<ManyA>();
    public ManyB() {

    }
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    public Long getId() {
        return id;
    }
    public String getName() {
        return name;
    }

    @ManyToMany(cascade=CascadeType.ALL)
    @JoinTable(
            name = "t_a_b",
            joinColumns = @JoinColumn(name="a_id"),
            inverseJoinColumns =  @JoinColumn(name="b_id")
            )
    public List<ManyA> getManyAList() {
        return manyAList;
    }
    public void setManyAList(List<ManyA> manyAList) {
        this.manyAList = manyAList;
    }
    public void setId(Long id) {
        this.id = id;
    }
    public void setName(String name) {
        this.name = name;
    }



}

演示结果如下:
这里写图片描述
3.1 如果是:没有添加 mappedBy=”heart”
建议还是加把,有兴趣可以测试去看看。

四、演示案例如下

@Test
    public void testHbm() {
        StandardServiceRegistry registry = new StandardServiceRegistryBuilder()
                .configure() 
                .build();
        SessionFactory sessionFactory = new MetadataSources(registry).buildMetadata().buildSessionFactory();
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值