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

配置持久化类常用的注解:

注:GeneratedValue指定了标识符的生成策略。jpa提供了4种标准用法。

01.AUTO:根据不同的数据库选择不同的策略

02.TABLE:使用表保存id值

03.INDENITY:使用数据库自动生成主键

04.SEQUENCE:使用序列创建主键(如Oracle)

配置关联关系常用的注解:

话不多说了,待大家来看看到底怎么用的才最重要

1.注解配置对象关联关系之   一对一(学生对学生证)

Student.java

package cn.zhang.entity;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToOne;
import javax.persistence.Table; //学生实体类
@Entity
@Table(name="Student2161")
public class Student {
@Id //主键
@GeneratedValue //主键生成策略
private Integer sid; private String name;
//配置之间的一对一的关系
//cascade={CascadeType.ALL}设置了级联
//mappedBy="stu"设置维护关系的控制权交给StuCard类这一方,相当于Student.hbm.xml中配置的inverse="true"
@OneToOne(mappedBy="stu",cascade={CascadeType.ALL})
private StuCard sCard;
public Integer getSid() {
return sid;
}
public void setSid(Integer sid) {
this.sid = sid;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public StuCard getsCard() {
return sCard;
}
public void setsCard(StuCard sCard) {
this.sCard = sCard;
} }

StuCard.java

package cn.zhang.entity;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToOne;
import javax.persistence.Table; //学生证实体类
@Entity
@Table(name="StuCard2161")
public class StuCard {
@Id //主键
@Column(length=18) //可以指定最大长度
private String cid;//身份证 @OneToOne //配置一对一关联
@JoinColumn(name="sid")//指定了维护关系的外键字段是Student的sid
private Student stu; public String getCid() {
return cid;
} public void setCid(String cid) {
this.cid = cid;
} public Student getStu() {
return stu;
} public void setStu(Student stu) {
this.stu = stu;
} }

最后只需要在hibernate.cfg.xml文件里面将该实体类加进去即可:

<!-- 注解配置 -->
<mapping class="cn.zhang.entity.Student"/>
<mapping class="cn.zhang.entity.StuCard"/>

测试:

package cn.zhang.test;

import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.After;
import org.junit.Before;
import org.junit.Test; import cn.zhang.entity.StuCard;
import cn.zhang.entity.Student;
import cn.zhang.util.HibernateUtil; public class MyTest { Session session;
Transaction tx; //单元测试前走
@Before
public void Before(){
session= HibernateUtil.currentSession();
tx= session.beginTransaction();
} //单元测试后走
@After
public void After(){
tx.commit();
HibernateUtil.closeSession();
} @Test
public void TestOne(){ Student student=new Student();
student.setName("good"); StuCard sCard=new StuCard();
sCard.setCid("11111111111111");
sCard.setStu(student);
student.setsCard(sCard); session.save(student); }
}

2.注解配置对象关联关系之   多对一(部门和员工)

Dept.java

package cn.zhang.entity;

import java.util.HashSet;
import java.util.Set; import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table; import org.hibernate.annotations.LazyCollection;
import org.hibernate.annotations.LazyCollectionOption; //部门实体类
@Entity
@Table(name="Dept2161")
public class Dept {
@Id
//主键生成策略
@GeneratedValue(strategy=GenerationType.SEQUENCE,generator="seq_gen")
@SequenceGenerator(name="seq_gen",sequenceName="SEQ_HouseNum",allocationSize=1,initialValue=1)
private Integer deptid; private String deptname;
@OneToMany(mappedBy="dept",cascade={CascadeType.ALL})
@LazyCollection(LazyCollectionOption.FALSE) //设置立即加载,默认为延迟加载
private Set<Emp> emps = new HashSet<Emp>();// 员工集合 public Set<Emp> getEmps() {
return emps;
} public void setEmps(Set<Emp> emps) {
this.emps = emps;
} public Integer getDeptid() {
return deptid;
} public void setDeptid(Integer deptid) {
this.deptid = deptid;
} public String getDeptname() {
return deptname;
} public void setDeptname(String deptname) {
this.deptname = deptname;
} }

Emp.java

package cn.zhang.entity;

import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table; //员工实体类
@Entity
@Table(name="Emp2161")
public class Emp {
@Id
//主键生成策略
@GeneratedValue(strategy=GenerationType.SEQUENCE,generator="seq_gen")
@SequenceGenerator(name="seq_gen",sequenceName="SEQ_HouseNum",allocationSize=1,initialValue=1)
private Integer empno; private String empname;
@ManyToOne(fetch=FetchType.LAZY) //fentch: 设置了延迟加载 ,默认为立即加载,不设置则会和dept表外连接查询
@JoinColumn(name="deptid")
private Dept dept;//所属部门 public Dept getDept() {
return dept;
} public void setDept(Dept dept) {
this.dept = dept;
} public Integer getEmpno() {
return empno;
} public void setEmpno(Integer empno) {
this.empno = empno;
} public String getEmpname() {
return empname;
} public void setEmpname(String empname) {
this.empname = empname;
} }

最后只需要在hibernate.cfg.xml文件里面将该实体类加进去即可:

<!-- 注解配置 -->
<mapping class="cn.zhang.entity.Dept"/>
<mapping class="cn.zhang.entity.Emp"/>

测试:

package cn.zhang.test;

import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.After;
import org.junit.Before;
import org.junit.Test; import cn.zhang.entity.Dept;
import cn.zhang.entity.Emp; import cn.zhang.util.HibernateUtil; public class MyTest { Session session;
Transaction tx; //单元测试前走
@Before
public void Before(){
session= HibernateUtil.currentSession();
tx= session.beginTransaction();
} //单元测试后走
@After
public void After(){
tx.commit();
HibernateUtil.closeSession();
} @Test
public void TestOne(){
Emp emp=new Emp();
emp.setEmpname("好人一个"); Dept dept=new Dept();
dept.setDeptname("人才部");
dept.getEmps().add(emp);
emp.setDept(dept);
session.save(dept); }
@Test
public void TestTwo(){
Emp emp = (Emp)session.load(Emp.class, 2);
System.out.println(emp.getEmpname()); System.out.println("------------"); Dept dept = (Dept)session.load(Dept.class, 1);
System.out.println(dept.getDeptname()); } }

3.注解配置对象关联关系之   多对多(项目和员工)

Emp.java

package cn.zhang.entity;

import java.util.HashSet;
import java.util.Set; import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.Table; @Entity
@Table(name = "Emp2161")
public class Emp {
@Id
@GeneratedValue
private Integer eid; private String name; @ManyToMany(cascade=CascadeType.ALL)//设置多对多和级联
//利用第三张表实现多对多的关联
@JoinTable(
name = "EmpPro2161", //指定第三张表名
joinColumns = @JoinColumn(name = "eid"), //Emp表在第三张表中的外键
inverseJoinColumns = @JoinColumn(name = "pid")//Project表在第三张表中的外键
)
private Set<Project> projects = new HashSet<Project>(); public Integer getEid() {
return eid;
} public void setEid(Integer eid) {
this.eid = eid;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public Set<Project> getProjects() {
return projects;
} public void setProjects(Set<Project> projects) {
this.projects = projects;
} }

Project.java

package cn.zhang.entity;

import java.util.HashSet;
import java.util.Set; import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import javax.persistence.Table;
@Entity
@Table(name="Project2161")
public class Project {
@Id
@GeneratedValue
private Integer pid; private String name;
@ManyToMany(mappedBy="projects")//设置多对多并指定维护关系的控制权交给Emp类这一方
private Set<Emp> emps=new HashSet<Emp>(); public Integer getPid() {
return pid;
} public void setPid(Integer pid) {
this.pid = pid;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public Set<Emp> getEmps() {
return emps;
} public void setEmps(Set<Emp> emps) {
this.emps = emps;
} }

最后只需要在hibernate.cfg.xml文件里面将该实体类加进去即可:

<!-- 注解配置 -->
<mapping class="cn.zhang.entity.Project"/>
<mapping class="cn.zhang.entity.Emp"/>

测试:

package cn.zhang.test;

import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.After;
import org.junit.Before;
import org.junit.Test; import cn.zhang.entity.Emp;
import cn.zhang.entity.Project;
import cn.zhang.util.HibernateUtil; public class MyTest { Session session;
Transaction tx; //单元测试前走
@Before
public void Before(){
session= HibernateUtil.currentSession();
tx= session.beginTransaction();
} //单元测试后走
@After
public void After(){
tx.commit();
HibernateUtil.closeSession();
} @Test
public void TestOne(){
Emp emp=new Emp();
emp.setName("好人一个"); Project project=new Project(); project.setName("好项目"); project.getEmps().add(emp);
emp.getProjects().add(project); session.save(emp); }
}

注意:在判断到底是谁维护关联关系时,可以通过查看外键,哪个实体类定义了外键,哪个类就负责维护关联关系。

Hibernate框架之注解的配置的更多相关文章

  1. 跟着刚哥学习Spring框架--通过注解方式配置Bean(四)

    组件扫描:Spring能够从classpath下自动扫描,侦测和实例化具有特定注解的组件. 特定组件包括: 1.@Component:基本注解,识别一个受Spring管理的组件 2.@Resposit ...

  2. 跟着刚哥学习Spring框架--通过XML方式配置Bean(三)

    Spring配置Bean有两种形式(XML和注解) 今天我们学习通过XML方式配置Bean 1. Bean的配置方式 通过全类名(反射)的方式   √ id:标识容器中的bean.id唯一. √ cl ...

  3. Java框架:spring框架整合hibernate框架的xml配置(使用注解的方式)

    <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...

  4. Hibernate框架之Criteria查询 和注解(重点☆☆☆☆☆,难点☆☆☆)

    写好一篇博客,不是容易的事.原因是:你要给自己以后看的时候,还能看懂,最重要的是当别人看到你的博客文章的时候,也一样很清楚的明白你自己写的东西.其实这也是一种成就感!! 对于每一个知识点,要有必要的解 ...

  5. SSH(Struts2+Spring+Hibernate)框架搭建流程<注解的方式创建Bean>

    此篇讲的是MyEclipse9工具提供的支持搭建自加包有代码也是相同:用户登录与注册的例子,表字段只有name,password. SSH,xml方式搭建文章链接地址:http://www.cnblo ...

  6. 使用Hibernate框架技术时,对项目进行的配置

    1.在需要使用Hibernate框架技术的项目上单击鼠标右键,在弹出的菜单中选择MyEclipse-->Add Hibernate Capabilities,打开Add Hibernate Ca ...

  7. hibernate3整合spring2时hibernate即用注解又用配置文件情况时spring配置文件的配置写法

    hibernate只用注解时,spring的配置文件的配置如下 <bean id="dataSource" class="org.apache.commons.db ...

  8. Hibernate框架--配置,映射,主键

    SSH框架: Struts框架, 基于mvc模式的应用层框架技术! Hibernate,    基于持久层的框架(数据访问层使用)! Spring,   创建对象处理对象的依赖关系以及框架整合! Da ...

  9. Hibernate框架学习之注解映射实体类

         前面的相关文章中,我们已经介绍了使用XML配置文件映射实体类及其各种类型的属性的相关知识.然而不论是时代的潮流还是臃肿繁杂的配置代码告诉我们,注解配置才是更人性化的设计,于是学习了基本的映射 ...

随机推荐

  1. Qt编写可换肤的中文双拼汉字输入法

    时间过得真快,不知不觉已到2015年,农历春节一眨眼就过去了,端正状态收拾心情整装待发出发. 曾经有段时间,我有一个很执着的梦想,我要导演出一部空前绝后的巨幕.不过现实无情地碾碎我的梦想,也同时将我推 ...

  2. 个性化EDM数据营销的三大提醒

    EDM数据营销行业已经进入个性化时代.但是怎样实现个性化仍然是一个重大课题.国内领先的智能化邮件营销服务商Focussend一直致力于探索和研究邮件营销领域的先进知识和做法,旨在为企业和个人提供更多有 ...

  3. 在自己的对象里实现IEnumerator和IEnumerable

    平时工作中我们经常用foreach来迭代一个集合.比如 foreach (Student student in myClass) { Console.WriteLine(student); } 基本所 ...

  4. 最近新装系统windows8.1+Mac。。。还没装驱动就遇到一堆问题。。。

    ---恢复内容开始--- 1,刚开始装好了,后来莫名看不到磁盘了,原因:64位mac盘会丢失盘符,所以macdrive也看不到...解决:(将AF改为06,修改内容后改回AF,早知道这么简单就不用重新 ...

  5. 全国DNS服务器IP地址【电信、网通、铁通】

    免费DNS地址: 114DNS:114.114.114.114(推荐国内使用) Google DNS:8.8.8.8(国外) ************************************* ...

  6. Oracle DBA的神器: PRM恢复工具,可脱离Oracle软件运行,直接读取Oracle数据文件中的数据

    Oracle DBA的神器: PRM恢复工具,可脱离Oracle软件运行,直接读取Oracle数据文件中的数据 PRM 全称为ParnassusData Recovery Manager ,由 诗檀软 ...

  7. 3-5年的PHPer常见的面试题

    看到有很多,的总结一下,比较适合有一定经验的PHPer 1.平时喜欢哪些php书籍及博客?CSDN.虎嗅.猎云 2.js闭包是什么? 3.for与foreach哪个更快? 4.php鸟哥是谁?能不能讲 ...

  8. 基于CSS3和HTML5图片加工前后对比代码

    分享一款CSS3和HTML5图片加工前后对比代码.这是一款通过CSS3和HTML5将图像转换为自动响应的元素:图像缩放和裁剪以适应容器.效果图如下: 在线预览   源码下载 实现的代码. html代码 ...

  9. 我所研究过的 ASP.NET MVC 或者 .NET 或者 ORM 或者框架的开源项目

    ASP.NET MVC 的开源项目有很多,这里列出我所研究过的: SocialGoal v1.0.0 prodinner nopCommerce SmartStore.NET 由于今天才做收集工作,可 ...

  10. NGUI之UIRoot屏幕分辨率自适应

    NGUI在Unity3D游戏开发中非常常用,而NGUI对于每一个UI场景,都是以一个UIRoot为UI游戏对象树的根的,那么这个UIRoot是起什么作用的呢? 先简单看一下UIRoot中的基本属性 U ...