设为首页 加入收藏

TOP

hibernate关联映射(二)
2015-11-21 01:41:43 来源: 作者: 【 】 浏览:5
Tags:hibernate 关联 映射
ot null auto_increment, name varchar(255), wifeId integer, primary key (id) ) 20:03:18,618 ERROR org.hibernate.tool.hbm2ddl.SchemaExport:348 - Unsuccessful: create table Husband (id integer not null auto_increment, name varchar(255), wifeId integer, primary key (id)) 20:03:18,618 ERROR org.hibernate.tool.hbm2ddl.SchemaExport:349 - Table 'husband' already exists 20:03:18,619 DEBUG org.hibernate.tool.hbm2ddl.SchemaExport:377 - create table Wife ( id integer not null auto_increment, name varchar(255), primary key (id) ) 20:03:18,933 DEBUG org.hibernate.tool.hbm2ddl.SchemaExport:377 - alter table Husband add index FKAEEA401B109E78ED (wifeId), add constraint FKAEEA401B109E78ED foreign key (wifeId) references Wife (id) 数据库里,wife表里没有外键了。
但是,在代码层次我们依然可以从Wife类里获得Husband。

注意上面的 @OneToOne(mappedBy="wife")
只有是双向关联,最好就都写上mappedBy,两张表有一个外键就够了。



多对一单向关联

每个人都会有很多个梦想,但是每一个梦想只属于某一个具体的人。
我们先不管java代码上如何实现,在数据库里。
上面的两张表,一个是person,里面就是id,name
再就是dream表,一个id,一个description。
那么它们的外键放在哪张表里呢?
放在dream里,换言之,dream表里有一个字段叫personId。
这个的原因,不用解释。
所有一对多,多对一的关系,在数据库里,外键都是放在多的一方里的。
为什么。自己想。


看代码
package com.bjsxt.hibernate;

@Entity
public class Dream {
    private int id;
    private String description;    
    private Person person;
    
    @Id
    @GeneratedValue
    public int getId() {
        return id;
    }
    @ManyToOne
    @JoinColumn(name="personId")
    public Person getPerson() {
        return person;
    }
    //省略get set
}


package com.bjsxt.hibernate;

@Entity
public class Person {
    private int id;
    private String name;
    
    @Id
    @GeneratedValue
    public int getId() {
        return id;
    }    
    //省略get set
}
从代码层次上看"多对一单向"
就是我可以从多的一方(dream)里获得一的那一方(person)。
因为是单向,所以不能从person获得他所有的dream。
OK,生成的表里,dream里有personid。
20:20:21,970 DEBUG org.hibernate.tool.hbm2ddl.SchemaExport:377 -
    create table Dream (
        id integer not null auto_increment,
        description varchar(255),
        personId integer,
        primary key (id)
    )
20:20:22,264 DEBUG org.hibernate.tool.hbm2ddl.SchemaExport:377 -
    create table Person (
        id integer not null auto_increment,
        name varchar(255),
        primary key (id)
    )
20:20:22,765 DEBUG org.hibernate.tool.hbm2ddl.SchemaExport:377 -
    alter table Dream
        add index FK3F397E3C1409475 (personId),
        add constraint FK3F397E3C1409475
        foreign key (personId)
        references Person (id)



一对多单向关联

还是人与梦想的例子。
我想在代码层次,通过人获得他的所有的梦想,怎么办?
首先在dream类里删除person的引用
package com.bjsxt.hibernate;

@Entity
public class Person {
    private int id;
    private String name;
    private Set dreams=new HashSet<>();
    
    @Id
    @GeneratedValue
    public int getId() {
        return id;
    }

    @OneToMany
    @JoinColumn(name="psrsonId")
    public Set getDreams() {
        return dreams;
    }    
}


OK,大功告成。
建表语句和上面的一样。
装dream的集合类为什么是set?list行不,map行不?
都行。
但是记着,数据库里面的记录是无序且不相等的。
你说用哪个?


不管是oneToMany还是manyToMany,加的 @JoinColumn(name="abc")
都是在多的一方加入指向少的一方的名叫abc的外键。


一对多双向关联(多对一双向关联)

下面的例子,大家猜也猜到了,我既想从dream获得它所属的person,还想从person获得他所有的dream。
我们看代码:
package com.bjsxt.hibernate;

@Entity
public class Dream {
    private int id;
    private String description;
    
    private Person person;
    
    @Id
    @GeneratedValue
    public int getId() {
        return id;
    }

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

    @ManyToOne
    @JoinColumn(name="personId")
    public Person getPerson() {
        return person;
    }
}

package com.bjsxt.hibernate;

@Entity
public class Person {
    private int id;
    private String n
首页 上一页 1 2 3 下一页 尾页 2/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Redis消息队列 下一篇HiveJoin

评论

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