Hibernate 零配置Annotation注解

来源:互联网 发布:windows未能启动原因是 编辑:程序博客网 时间:2024/06/01 09:53

  JPA规范推荐使用Annotation来管理实体类与数据表之间的映射关系,从而避免同时维护两份文件(Java 实体类 和 XML 映射文件),将映射信息(写在Annotation中)与实体类集中在一起。 

   主要将替换复杂的hbm.xml文件简化Hibernate程序开发

   注解配置实体类

  

package com.hlx.annotation;import java.io.Serializable;import java.sql.Blob;import java.sql.Clob;import java.util.Date;import javax.annotation.Generated;import javax.persistence.Column;import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.persistence.GenerationType;import javax.persistence.Id;import javax.persistence.Lob;import javax.persistence.NamedQueries;import javax.persistence.NamedQuery;import javax.persistence.SequenceGenerator;import javax.persistence.Table;import javax.persistence.Temporal;import javax.persistence.TemporalType;import javax.persistence.Transient;import org.hibernate.annotations.GenericGenerator;//http://blog.csdn.net/yuanmuxingchen/article/details/48416611@Entity@Table(name="s_student",catalog="SCOTT")  //可以不写!//@NamedQuery(name="all",query="from Student")  //配置命名查询 hql//写多个必须是数组; 配置命名查询 hql@NamedQueries({@NamedQuery(name="findByName",query="from Student where name=:my"),@NamedQuery(name="all",query="from Student") })public class Student implements Serializable {//全部写在字段上,要么全部写在get方法上!@Id//@GeneratedValue(strategy=GenerationType.AUTO)  //自动序列hibernate;//自己创建的序列名称sequenceName = "seq_uid"//而并非数据库中定义的sequence来处理。必须加allocationSize=1,initialValue=1这两项配置才可以解决@SequenceGenerator(name = "sequenceGenerator",allocationSize=1,initialValue=1, sequenceName = "seq_uid")@GeneratedValue(generator="sequenceGenerator",strategy=GenerationType.SEQUENCE)private Integer sid;@Column(name="sname",length=20,nullable=false)private String name;@Column(name="sage")private Integer age;@Temporal(TemporalType.TIMESTAMP)   //年月日时分秒private Date birthday;@Column(name="smoney")private Double money;@Transient     //不持久化private String address;@Lob     //处理大字节private Blob music;@Lob    //处理大字节private Clob image;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 Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}public Date getBirthday() {return birthday;}public void setBirthday(Date birthday) {this.birthday = birthday;}public Double getMoney() {return money;}public void setMoney(Double money) {this.money = money;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}public Blob getMusic() {return music;}public void setMusic(Blob music) {this.music = music;}public Clob getImage() {return image;}public void setImage(Clob image) {this.image = image;}public Student() {super();// TODO Auto-generated constructor stub}public Student(Integer sid, String name, Integer age, Date birthday,Double money, String address, Blob music, Clob image) {super();this.sid = sid;this.name = name;this.age = age;this.birthday = birthday;this.money = money;this.address = address;this.music = music;this.image = image;}public Student(String name, Integer age, Double money) {super();this.name = name;this.age = age;this.money = money;}@Overridepublic String toString() {return "Student [sid=" + sid + ", name=" + name + ", age=" + age+ ", birthday=" + birthday + ", money=" + money + ", address="+ address + ", music=" + music + ", image=" + image + "]";}}

注解配置对象关联关系


Dept部门表 ==》Emp员工表 oneToMany

package com.hlx.onetomany;import java.util.HashSet;import java.util.Set;import javax.persistence.CascadeType;import javax.persistence.Entity;import javax.persistence.FetchType;import javax.persistence.GeneratedValue;import javax.persistence.GenerationType;import javax.persistence.Id;import javax.persistence.OneToMany;import javax.persistence.SequenceGenerator;/** * Dept entity. @author MyEclipse Persistence Tools */@Entitypublic class Dept implements java.io.Serializable {// Fields@Id   //PK@SequenceGenerator(name = "sequenceGenerator",allocationSize=1,initialValue=1, sequenceName = "seq_uid")@GeneratedValue(generator="sequenceGenerator",strategy=GenerationType.SEQUENCE)private Short deptno;private String dname;private String loc;//注意:注解时必须是泛型集合!!// --->  OneToMany指定了一对多的关系,mappedBy="dept"指定了由多的那一方来维护关联关系,mappedBy指的是多的一方对1的这一方的依赖的属性,(注意:如果没有指定由谁来维护关联关系,则系统会给我们创建一张中间表)@OneToMany(cascade=CascadeType.ALL,fetch=FetchType.LAZY,mappedBy="dept")private Set<Emp> emps = new HashSet<Emp>(0);// Constructors/** default constructor */public Dept() {}
 Emp员工表==》Dept部门表 manyToOne

package com.hlx.onetomany;import java.util.Date;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.NamedQuery;import javax.persistence.Temporal;import javax.persistence.TemporalType;/** * Emp entity. @author MyEclipse Persistence Tools */@Entity//@NamedQuery(name="find1",query="from Emp  e where e.dept.deptno=?")@NamedQuery(name="find1",query="from Emp  e where e.dept.dname=?")public class Emp implements java.io.Serializable {// Fields@Id   //PK@GeneratedValue(strategy=GenerationType.AUTO)  //hibernate自动生成序列private Integer empno;// ---> ManyToOne指定了多对一的关系,fetch=FetchType.LAZY属性表示在多的那一方通过延迟加载的方式加载对象(默认不是延迟加载)@ManyToOne(fetch=FetchType.LAZY)//--->  通过 JoinColumn 的name属性指定了外键的名称 deptno (注意:如果我们不通过JoinColum来指定外键的名称,系统会给我们声明一个名称)@JoinColumn(name="deptno")private Dept dept;private Double comm;private String ename;@Temporal(TemporalType.DATE) //年月日private Date hiredate;private String job;private Integer mgr;private Double sal;// Constructors/** default constructor */public Emp() {}/** full constructor */public Emp(Dept dept, Double comm, String ename, Date hiredate,String job, Integer mgr, Double sal) {this.dept = dept;this.comm = comm;this.ename = ename;this.hiredate = hiredate;this.job = job;this.mgr = mgr;this.sal = sal;}// Property accessorspublic Integer getEmpno() {return this.empno;}public void setEmpno(Integer empno) {this.empno = empno;}public Dept getDept() {return this.dept;}public void setDept(Dept dept) {this.dept = dept;}public Double getComm() {return this.comm;}public void setComm(Double comm) {this.comm = comm;}public String getEname() {return this.ename;}public void setEname(String ename) {this.ename = ename;}public Date getHiredate() {return this.hiredate;}public void setHiredate(Date hiredate) {this.hiredate = hiredate;}public String getJob() {return this.job;}public void setJob(String job) {this.job = job;}public Integer getMgr() {return this.mgr;}public void setMgr(Integer mgr) {this.mgr = mgr;}public Double getSal() {return this.sal;}public void setSal(Double sal) {this.sal = sal;}public Emp(String ename, Date hiredate, String job, Double sal) {super();this.ename = ename;this.hiredate = hiredate;this.job = job;this.sal = sal;}@Overridepublic String toString() {return "Emp [empno=" + empno + ", dept=" + dept + ", comm=" + comm+ ", ename=" + ename + ", hiredate=" + hiredate + ", job="+ job + ", mgr=" + mgr + ", sal=" + sal + "]";}}

测试:

public class TestOneToMany {@Testpublic void find3() {// 1.获得会话对象Session session = HibernateUtil.currentSession();// 2.开启事务Transaction tx = session.beginTransaction();// List<Emp> list= session.getNamedQuery("find1").setShort(0, new Short("20")).list(); List<Emp> list= session.getNamedQuery("find1").setString(0, "RESEARCH").list(); for (Emp student : list) {System.out.println(student);}//tx.commit();// 3.关闭会话HibernateUtil.closeSession();}@Testpublic void del() {// 1.获得会话对象Session session = HibernateUtil.currentSession();// 事务Transaction tx = session.beginTransaction();// // 删除数据==>查询是否有这个数据 Dept grade = (Dept) session.get(Dept.class, new Short("86"));//// // one那方 session.delete(grade);tx.commit();// 3.关闭会话HibernateUtil.closeSession();}@Testpublic void save() {// 1.获得会话对象Session session = HibernateUtil.currentSession();// 事务Transaction tx = session.beginTransaction();// 添加数据Dept dept = new Dept("TT", "HZ");Emp emp1 = new Emp("mike", new Date(), "CLERK", 500D);Emp emp2 = new Emp("bear", new Date(), "CLERK", 1000D);// 添加(你包含我)dept.getEmps().add(emp1);dept.getEmps().add(emp2);// (我包含你)emp1.setDept(dept);emp2.setDept(dept);// //////////////////// one那方session.save(dept);tx.commit();// 3.关闭会话HibernateUtil.closeSession();}}

学生表 ===》老师表  manyToMany

@Entitypublic class Studentm implements java.io.Serializable {// Fields@Id@GeneratedValue(strategy=GenerationType.AUTO)private Integer sid;private String sname;// --->  因为多对多之间会通过一张中间表来维护两表直接的关系,所以通过 JoinTable 这个注解来声明,name就是指定了中间表的名字,//JoinColumns是一个 @JoinColumn类型的数组,表示的是我这方在对方中的外键名称,我方是Student,所以在对方外键的名称就是 msid,//inverseJoinColumns也是一个 @JoinColumn类型的数组,表示的是对方在我这放中的外键名称,对方是Teacher,所以在我方外键的名称就是 mtid@ManyToMany   @JoinTable(name="TEACHERM_STUDENTM",joinColumns={@JoinColumn(name="MSID")},inverseJoinColumns={@JoinColumn(name="mtid")}) private Set<Teacherm>  teacherms= new HashSet<Teacherm>(0);// Constructorspublic Set<Teacherm> getTeacherms() {return teacherms;}public void setTeacherms(Set<Teacherm> teacherms) {this.teacherms = teacherms;}

老师表  ===》学生表 manyToMany

@Entitypublic class Teacherm implements java.io.Serializable {// Fields@Id@GeneratedValue(strategy = GenerationType.AUTO)private Integer tid;private String tname;//--->  表示由Student那一方来进行维护@ManyToMany(cascade=CascadeType.ALL,mappedBy="teacherms")private Set<Studentm> studentms = new HashSet<Studentm>();// Constructorspublic Set<Studentm> getStudentms() {return studentms;}public void setStudentms(Set<Studentm> studentms) {this.studentms = studentms;}

测试:

public class TestManyToMany {@Testpublic void test2Find() {// 1.获得会话对象Session session = HibernateUtil.currentSession();// 事务Transaction tx = session.beginTransaction();// 删除数据==>查询是否有这个数据Teacherm t1 = (Teacherm) session.get(Teacherm.class, 151);Set<Studentm> set = t1.getStudentms();for (Studentm studentm : set) {System.out.println(studentm);}tx.commit();// 3.关闭会话HibernateUtil.closeSession();}@Testpublic void test2Del() {// 1.获得会话对象Session session = HibernateUtil.currentSession();// 事务Transaction tx = session.beginTransaction();// 删除数据==>查询是否有这个数据Teacherm t1 = (Teacherm) session.get(Teacherm.class, 148);// one那方session.delete(t1);tx.commit();// 3.关闭会话HibernateUtil.closeSession();}@Testpublic void test2Save() {// 1.获得会话对象Session session = HibernateUtil.currentSession();// 事务Transaction tx = session.beginTransaction();// 添加数据Teacherm t1 = new Teacherm("mike");Teacherm t2 = new Teacherm("john");Studentm st1 = new Studentm("rabbit");Studentm st2 = new Studentm("cat");Studentm st3 = new Studentm("bear");Studentm st4 = new Studentm("apple");// (你包含我)t1.getStudentms().add(st1);t1.getStudentms().add(st2);t2.getStudentms().add(st3);t2.getStudentms().add(st4);// (我包含你)st1.getTeacherms().add(t1);st2.getTeacherms().add(t1);st3.getTeacherms().add(t2);st4.getTeacherms().add(t2);// //////////////////// 老师方session.save(t1);session.save(t2);tx.commit();// 3.关闭会话HibernateUtil.closeSession();}}