Hibernate注解方式实现1-N双向关联

由于Hibernate可以实现逆向工程,可以自动在数据库中创建表,因此这里不提供数据字典内容。

以微博或博客为例,用户和博客之间属于一对多的关系,即1-N型,在数据库中我们希望构建如下关系

创建用户实体类User:

import ***;

/**
 * @author Barudisshu
 */
@Entity
@Table(name = "t_user", schema = "", catalog = "db_blog")
public class User implements Serializable {

    private int id;                 //用户自动Id
    private String username;        //用户名
    private String password;        //密码

    private Collection<Post> posts; //用户博客

    @Id
    @Column(name = "id", nullable = false, insertable = true, updatable = true)
    public int getId() {
        return id;
    }

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

    @Basic
    @Column(name = "username", nullable = true, insertable = true, updatable = true, length = 255)
    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    @Basic
    @Column(name = "password", nullable = true, insertable = true, updatable = true, length = 255)
    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    //添加mappedBy属性,否则将创建中间表
    @OneToMany(cascade = CascadeType.PERSIST,targetEntity = Post.class,mappedBy = "user")
    @OrderBy("id")
    public Collection<Post> getPosts() {
        return posts;
    }

    public void setPosts(Collection<Post> posts) {
        this.posts = posts;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        User user = (User) o;

        if (id != user.id) return false;
        if (password != null ? !password.equals(user.password) : user.password != null) return false;
        if (username != null ? !username.equals(user.username) : user.username != null) return false;

        return true;
    }

    @Override
    public int hashCode() {
        int result = id;
        result = 31 * result + (username != null ? username.hashCode() : 0);
        result = 31 * result + (password != null ? password.hashCode() : 0);
        return result;
    }

    @Override
    public String toString() {
        return ToStringBuilder.reflectionToString(this);
    }

}

值得注意的是,以User作为外键的表会自动生成一个对应的字段并以@OrderBy内值自动创建,mappedBy属性内容为目标实体的对应关联字段,如果没有该属性,hibernate会自动创建User和Post的一个中间表。

下面为博客实体类Post:

import ***;

/**
 * @author Barudisshu
 */
@Entity
@Table(name = "t_post", schema = "", catalog = "db_blog")
public class Post implements Serializable{

    private int id;         //博客自动Id
    private String title;   //博客标题
    private Timestamp time; //发布时间
    private String digest;  //摘要
    private String mark;    //标记
    private String content; //博客正文
    private Integer type;   //博客分类
    private Integer views;  //浏览次数

    private User user;      //博客用户

    @Id
    @Column(name = "id", nullable = false, insertable = true, updatable = true)
    public int getId() {
        return id;
    }

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

    @Basic
    @Column(name = "title", nullable = true, insertable = true, updatable = true, length = 255)
    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    @Basic
    @Column(name = "time", nullable = true, insertable = true, updatable = true)
    public Timestamp getTime() {
        return time;
    }

    public void setTime(Timestamp time) {
        this.time = time;
    }

    @Basic
    @Column(name = "digest", nullable = true, insertable = true, updatable = true, length = 1600)
    public String getDigest() {
        return digest;
    }

    public void setDigest(String digest) {
        this.digest = digest;
    }

    @Basic
    @Column(name = "mark", nullable = true, insertable = true, updatable = true, length = 255)
    public String getMark() {
        return mark;
    }

    public void setMark(String mark) {
        this.mark = mark;
    }

    @Basic
    @Column(name = "content", nullable = true, insertable = true, updatable = true, length = 2147483647)
    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }

    @Basic
    @Column(name = "type", nullable = true, insertable = true, updatable = true)
    public Integer getType() {
        return type;
    }

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

    @Basic
    @Column(name = "views", nullable = true, insertable = true, updatable = true)
    public Integer getViews() {
        return views;
    }

    public void setViews(Integer views) {
        this.views = views;
    }

    @ManyToOne(cascade = CascadeType.PERSIST,targetEntity = User.class)
    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        Post post = (Post) o;

        if (id != post.id) return false;
        if (content != null ? !content.equals(post.content) : post.content != null) return false;
        if (digest != null ? !digest.equals(post.digest) : post.digest != null) return false;
        if (mark != null ? !mark.equals(post.mark) : post.mark != null) return false;
        if (time != null ? !time.equals(post.time) : post.time != null) return false;
        if (title != null ? !title.equals(post.title) : post.title != null) return false;
        if (type != null ? !type.equals(post.type) : post.type != null) return false;
        if (views != null ? !views.equals(post.views) : post.views != null) return false;

        return true;
    }

    @Override
    public int hashCode() {
        int result = id;
        result = 31 * result + (title != null ? title.hashCode() : 0);
        result = 31 * result + (time != null ? time.hashCode() : 0);
        result = 31 * result + (digest != null ? digest.hashCode() : 0);
        result = 31 * result + (mark != null ? mark.hashCode() : 0);
        result = 31 * result + (content != null ? content.hashCode() : 0);
        result = 31 * result + (type != null ? type.hashCode() : 0);
        result = 31 * result + (views != null ? views.hashCode() : 0);
        return result;
    }

    @Override
    public String toString() {
        return ToStringBuilder.reflectionToString(this);
    }

}

对于有向与无向的概念,实质上就是是否可以通过一个实体获取得到另一个实体,这样一般要求考虑是否级联操作,如果实际项目中查询复杂度太大,建议使用HQL来进行操作,相对应的建表的时候建立一种较弱的关联。

时间: 2024-10-25 03:03:09

Hibernate注解方式实现1-N双向关联的相关文章

hibernate 注解方式讲解映射关系

注解方式讲解映射关系 1       One-To-One Unidirectional with Foreign Key 单向关联外键方式. 1.1         关系如下 学生和地址关系的例子.一个学生住在一个地址上.一个地址只能由一个学生占用. 1.2         Address代码: package com.daodaofun.domain; import javax.persistence.*; @Entity @Table(name="STUDENT") public

hibernate注解方式来处理映射关系

在hibernate中,通常配置对象关系映射关系有两种,一种是基于xml的方式,另一种是基于annotation的注解方式,熟话说,萝卜青菜,可有所爱,每个人都有自己喜欢的配置方式,我在试了这两种方式以后,发现使用annotation的方式可以更简介,所以这里就简单记录下通过annotation来配置各种映射关系,在hibernate4以后已经将annotation的jar包集成进来了,如果使用hibernate3的版本就需要引入annotation的jar包. 一.单对象操作 @Entity

hibernate之关于一对一单向,双向关联映射

[hibernate]之关于一对一单向,双向关联映射 首先我们来看,Hibernate官方对于一对一单向关联的解释: 基于外键关联的单向一对一关联和单向多对一关联几乎是一样的.唯一的不同就是单向一对一关 联中的外键字段具有唯一性约束. ok,那我们也可以这样理解,一对一其实就是多对一关联的特殊形式,我们知道Hibernate的配置方式有两种,分别是Annotations,XML两种配置方式! Annotations的一对一单向关联映射 人(User)和***号(Card) @Entity @Ta

Hibernate注解方式开发实体类

Hibernate注解 1.@Entity(name="EntityName") 必须,name为可选,对应数据库中一的个表 2.@Table(name="",catalog="",schema="") 可选,通常和@Entity配合使用,只能标注在实体的class定义处,表示实体对应的数据库表的信息 name:可选,表示表的名称.默认地,表名和实体名称一致,只有在不一致的情况下才需要指定表名 catalog:可选,表示Cat

hibernate的映射之四(多对多双向关联)

Many-to-Many 多对多的映射可以使用一组Java集合不包含任何重复的元素来实现.我们已经看到了Hibernate如何设置映射集合. 集(SET)被映射到与映射表中<set>元素,并以java.util.HashSet初始化.您可以使用Set集合在类中时,集合不需要重复的元素. 多对多双向关联: 由于是双向关联,所以需要在二个实体中植入对方的实体集合. 我依旧以员工和项目为例子. 1.准备JavaBean(持久化类) 员工实体类 public class Employee { priv

Hibernate!!多对多(单向|双向)关联映射

多对多——单向关联映射 1 package com.hb.model; 2 3 import java.util.HashSet; 4 import java.util.Set; 5 6 import javax.persistence.Entity; 7 import javax.persistence.GeneratedValue; 8 import javax.persistence.Id; 9 import javax.persistence.ManyToMany; 10 import

Hibernate注解方式实现1-1双向关联

以微博或博客为例,我们希望用户-用户信息设计为如下关系,即用户表用户口令登录等操作.用户信息表用户记录信息: 用户User代码清单: import ***; /** * @author Barudisshu */ @Entity @Table(name = "t_user", schema = "", catalog = "db_blog") public class User implements Serializable { private

hibernate注解方式实现一对多映射

首先是在hibernate.cfg.xml中引入要映射的class <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-co

Hibernate注解:一对多外键关联

情形:两个表,cms_mode是主表,cms_model_field是子表,cms_model_field的model_id字段关联到cms_model的主键. # # Source for table cms_model # DROP TABLE IF EXISTS `cms_model`; CREATE TABLE `cms_model` ( `model_id` int(11) NOT NULL, `name` varchar(50) NOT NULL DEFAULT '', `title