设为首页 加入收藏

TOP

hibernate关联映射(一)
2015-11-21 01:41:43 来源: 作者: 【 】 浏览:3
Tags:hibernate 关联 映射
本文可作为北京尚学堂马士兵hibernate课程的学习笔记。
hibernate的映射,主要分为一对一,一对多,多对一,多对多,同时还要单向与双向的区别。
OK,不要纠结于名字,我们开始看例子。


一对一单向

老公是一个实体,老婆也是一个实体。
一个老公只有一个老婆,同时一个老婆也只有一个老公。
上面的关系就叫做一对一。
什么叫单向呢。
看代码:
package com.bjsxt.hibernate;

@Entity
public class Husband {
    private int id;
    private String name;
    private Wife wife;
    
    @Id
    @GeneratedValue
    public int getId() {
        return id;
    }
    
    @OneToOne
    @JoinColumn(name="wifeId")
    public Wife getWife() {
        return wife;
    }
    //省略get set
}


package com.bjsxt.hibernate;

@Entity
public class Wife {
    private int id;
    private String name;
    
    @Id
    @GeneratedValue
    public int getId() {
        return id;
    }
    //省略get set
}


看上面的代码,老公里面有老婆的引用,而老婆里面并没有老婆的引用。
换句话说在代码层次上,根据老公我们可以获得他的老婆,但是根据老婆无法获得老公。(这就是单向)

我们看看它运行的代码
package com.bjsxt.hibernate;

import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.tool.hbm2ddl.SchemaExport;

public class Test {
    public static void main(String[] args) {
        new SchemaExport(new AnnotationConfiguration().configure()).create(false, true);    
    }
}
在hibernate的配置文件里
加上
update
结果
19:41:04,229 DEBUG org.hibernate.tool.hbm2ddl.SchemaExport:377 -
    create table Husband (
        id integer not null auto_increment,
        name varchar(255),
        wifeId integer,
        primary key (id)
    )
19:41:04,549 DEBUG org.hibernate.tool.hbm2ddl.SchemaExport:377 -
    create table Wife (
        id integer not null auto_increment,
        name varchar(255),
        primary key (id)
    )
19:41:04,880 DEBUG org.hibernate.tool.hbm2ddl.SchemaExport:377 -
    alter table Husband
        add index FKAEEA401B109E78ED (wifeId),
        add constraint FKAEEA401B109E78ED
        foreign key (wifeId)
        references Wife (id)

先给husband加了一个字段,wifeId,然后让他作为外键引用wife表的id字段。
大家可以看到,@JoinColumn(name="wifeId")这个元标签指示了husband表内部那那个关联字段的名字。
如果没有这个元标签呢?
那么关联字段就是是:wife_id。即tableName_primarykey。
如果把 @onetoone写到Wife里(husband里没有onotoone的标签),那么我们就能从wife获得husband了(在代码层次)。

一对一双向

如果我既想从husband里取得wife,也想从wife里取得husband。那咋办?
把husband里的标签复制一遍就OK了嘛。
package com.bjsxt.hibernate;

@Entity
public class Wife {
    private int id;
    private String name;
    private Husband husband;
    
    @Id
    @GeneratedValue
    public int getId() {
        return id;
    }
    
    @OneToOne
    @JoinColumn(name="husbandId")
    public Husband getHusband() {
        return husband;
    }

}

OK,上面的代码里,wife也可以取到husband了。
我们看看hibernate生成的sql
create table Husband (
        id integer not null auto_increment,
        name varchar(255),
        wifeId integer,
        primary key (id)
    )
19:53:20,487 DEBUG org.hibernate.tool.hbm2ddl.SchemaExport:377 -
    create table Wife (
        id integer not null auto_increment,
        name varchar(255),
        husbandId integer,
        primary key (id)
    )
19:53:20,824 DEBUG org.hibernate.tool.hbm2ddl.SchemaExport:377 -
    alter table Husband
        add index FKAEEA401B109E78ED (wifeId),
        add constraint FKAEEA401B109E78ED
        foreign key (wifeId)
        references Wife (id)
19:53:21,421 DEBUG org.hibernate.tool.hbm2ddl.SchemaExport:377 -
    alter table Wife
        add index FK292331CE01A6E1 (husbandId),
        add constraint FK292331CE01A6E1
        foreign key (husbandId)
        references Husband (id)
看见了吧,wife里面有外键,husband里面也有外键!
这不是冗余了嘛。
把wife类改成下面的样子
    @OneToOne(mappedBy="wife")
    public Husband getHusband() {
        return husband;
    }
这个mappedBy的意思是说,我(Wife这个类)和husband这个类是一对一关联的,但是关联的外键由husband类的getWife方法控制。
运行一下。
20:03:18,611 DEBUG org.hibernate.tool.hbm2ddl.SchemaExport:377 -
    create table Husband (
        id integer n
首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Redis消息队列 下一篇HiveJoin

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: