在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); } }
注意:在判断到底是谁维护关联关系时,可以通过查看外键,哪个实体类定义了外键,哪个类就负责维护关联关系。