您的位置:首页 > 其它

hibernate总结之关联映射(多对一和一对多)

2014-01-07 18:40 627 查看
1.对象-关系映射

对象-关系映射(Object/Relation Mapping,简称ORM),是随着面向对象的软件开发方法发展而产生的。面向对象的开发方法是当今企业级应用开发环境中的主流开发方法,关系数据库是企业级应用环境中永久存放数据的主流数据存储系统。对象和关系数据是业务实体的两种表现形式,业务实体在内存中表现为对象,在数据库中表现为关系数据。内存中的对象之间存在关联和继承关系,而在数据库中,关系数据无法直接表达多对多关联和继承关系。因此,对象-关系映射(ORM)系统一般以中间件的形式存在,主要实现程序对象到关系数据库数据的映射。

2.关联映射分类:

单项关联:多对一,一对多,一对一

双向关联:多对一/一对多,一对一

3.双向关联也就是两个单向关联组合而成的,就直接看双向关联(多对一/一对多)

首先看两个模型吧



由两个表之间的关系可以看出来,学生是多的一方,小组是一的一方。

那我们来看看两者之间的javabean是如何写的吧

学生bean

package com.iflysse.hiber.domain;

import java.io.Serializable;
import java.util.List;
import java.util.Set;

import com.alibaba.fastjson.JSONObject;

/**
* @desc: ForumUsers
* @author: junhan
* @createTime:2013-12-11 17:20:01
* @history:
* @version: v1.0
*/
public class ForumUsers implements Serializable {
/**
* serialVersionUID
*/
private static final long serialVersionUID = 3018791976041484128L;
/**
* 用户主键
*/
private long userid;
/**
* 用户名
*/
private String username;

/**
* 所属组
*/
private ForumGroup group;

/**
* @param username
*            the usernameto set
*/
public void setUsername(String username) {
this.username = username;
}

/**
* @return the username
*/
public String getUsername() {
return username;
}

/**
* @param userid
*            the useridto set
*/
public void setUserid(long userid) {
this.userid = userid;
}

/**
* @return the userid
*/
public long getUserid() {
return userid;
}

public ForumGroup getGroup() {
return group;
}

public void setGroup(ForumGroup group) {
this.group = group;
}

@Override
public String toString() {
return JSONObject.toJSONString(this);
}

}

小组bean

/*
* Copyright @ 2013 com.iflysse.trains
* exam-persis-hib 下午10:14:46
* All right reserved.
*
*/
package com.iflysse.hiber.domain;

import java.io.Serializable;
import java.util.Set;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.persistence.Transient;

import org.hibernate.annotations.Formula;

import com.alibaba.fastjson.JSONObject;

/**
* @desc: exam-persis-hib
* @author: junhan
* @createTime: 2013年12月29日 下午10:14:46
* @history:
* @version: v1.0
*/
@Entity
@Table(name = "TB_FORUM_GROUP")
@SequenceGenerator(name = "gorumGroupId", sequenceName = "SEQ_FORUM_GROUP")
public class ForumGroup implements Serializable {

/**
* serialVersionUID
*/
private static final long serialVersionUID = -1812764688438325842L;

/**
* 主键
*/
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "gorumGroupId")
private int groupid;
/**
* 组名
*/
@Column
private String groupname;

/**
* 组员
*/
private Set<ForumUsers> users;

public int getGroupid() {
return groupid;
}

public void setGroupid(int groupid) {
this.groupid = groupid;
}

public String getGroupname() {
return groupname;
}

public void setGroupname(String groupname) {
this.groupname = groupname;
}

public Set<ForumUsers> getUsers() {
return users;
}

public void setUsers(Set<ForumUsers> users) {
this.users = users;
}

@Override
public String toString() {
return JSONObject.toJSONString(this);
}

}


映射文件主要是由两个标签哎牵涉到这两者之间的关系的

放在学生的映射文件中

<many-to-one name="group" column="groupid" cascade="all" fetch="join" ></many-to-one>

常用的属性

name: 属性名。

column (可选): 外间字段名。它也可以通过嵌套的 <column>元素指定。

class (可选 - 默认是通过反射得到属性类型): 关联的类的名字。

cascade(级联) (可选): 指明哪些操作会从父对象级联到关联的对象。

unique (可选): 使用DDL为外键字段生成一个唯一约束。此外, 这也可以用作property-ref的目标属性。这使关联同时具有 一对一的效果。

not-null (可选): 使用DDL为外键字段生成一个非空约束。

lazy (可选 - 默认为 proxy): 默认情况下,单点关联是经过代理的。lazy="no-proxy"指定此属性应该在实例变量第一次被访问时应该延迟抓取(fetche

lazily)(需要运行时字节码的增强)。 lazy="false"指定此关联总是被预先抓取。

放在小组映射文件中

<set name="users" lazy="true" inverse="true">

<key column="groupid"></key>

<one-to-many class="ForumUsers"/>

</set>

<
set
name
=
"children"

// 设定待映射持久化类的属性名:这里为你定义的类的childred属性
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: