hibernate 之 annotation

来源:互联网 发布:我的体育老师卫视网络 编辑:程序博客网 时间:2024/06/05 09:07
import java.util.Date;import javax.persistence.Column;//注意此处是javax的import javax.persistence.Entity;import javax.persistence.EnumType;import javax.persistence.Enumerated;import javax.persistence.GeneratedValue;import javax.persistence.GenerationType;import javax.persistence.Id;import javax.persistence.Table;import javax.persistence.Temporal;import javax.persistence.TemporalType;import javax.persistence.Transient;@Entity  //每个持久化POJO类都是一个实体Bean, 通过在类的定义中使用 @Entity 注解来进行声明@Table(name="_teacher")//指定表名public class Teacher {private int id;private String name;private String stuNo;private Title title;private Date date;/** * ID生成策略: * xml: 常用 native,identity,sequence,uuid,用generator设置  eg:  <id name="id"><generator class="native"/></id> * annotation: 默认@GeneratedValue(strategy=GenerationType.AUTO)对mysql使用auto_increment,oracle 使用sequence */@Id //指定主键@GeneratedValue(strategy=GenerationType.AUTO)@Column(name="teacher_id")//指定列名 (通常写在get方法上)public int getId() {return id;}public void setId(int id) {this.id = id;}@Column(name="username")public String getName() {return name;}public void setName(String name) {this.name = name;}//  Column属性:@Column(updatable = false, name = "flight_name", nullable = false, length=50)//@Column(//    name="columnName";                                (1)//    boolean unique() default false;                   (2)//    boolean nullable() default true;                  (3)//    boolean insertable() default true;                (4)//    boolean updatable() default true;                 (5)//    String columnDefinition() default "";             (6)//    String table() default "";                        (7)//    int length() default 255;                         (8)//    int precision() default 0; // decimal precision   (9)//    int scale() default 0; // decimal scale@Transient //此字段不生成表中的列名public String getStuNo() {return stuNo;}public void setStuNo(String stuNo) {this.stuNo = stuNo;}@Temporal(value=TemporalType.DATE)//处理时间类型精度 value属性可不写(@Temporal(TemporalType.DATE))public Date getDate() {return date;}public void setDate(Date date) {this.date = date;}@Enumerated(EnumType.STRING)//枚举类型public Title getTitle() {return title;}public void setTitle(Title title) {this.title = title;}}

联合主键:

/** * 联合主键 常用的两种方法 * i.@EmbeddedId * ii.@Id @IdClass(StuPk.class) *  * Hibernate要求具有联合主键的实体类实现Serializable接口,并且重写hashCode与equals方法, * 重写这两个方法的原因在于Hibernate要根据数据库的联合主键来判断某两行记录是否是一样的,如果一样那么就 * 认为是同一个对象,如果不一样,那么就认为是不同的对象。这反映到程序领域中就是根据hashCode与equals * 方法来判断某两个对象是否能够放到诸如Set这样的集合当中。联合主键的实体类实现Serializable接口的原因 * 在于使用get或load方法的时候需要先构建出来该实体的对象,并且将查询依据(联合主键)设置进去,然后作为get * 或load方法的第二个参数传进去即可 *  * 以下例子中主键是id,name */


主键实体类:

import java.io.Serializable;public class StuPk implements Serializable{private int id;private String name;public int getId() {return id;}public String getName() {return name;}public void setId(int id) {this.id = id;}public void setName(String name) {this.name = name;}@Overridepublic boolean equals(Object obj) {if(obj instanceof StuPk){StuPk stuPk=(StuPk)obj;if(this.id==stuPk.id&&this.name.equals(stuPk.name))return true;}return false;}@Overridepublic int hashCode() {return this.name.hashCode();}}


import javax.persistence.EmbeddedId;import javax.persistence.Entity;import javax.persistence.Id;import javax.persistence.IdClass;import javax.persistence.Table;@Entity@Table(name="_student")@IdClass(StuPk.class) //使用第二种方法public class Student {private int  id; //第二种方法private String name;//第二种方法//private StuPk stuPk;// 使用第一种方法时  包含id,nameprivate String title;@Id  //第二种方法public int getId() {return id;}public void setId(int id) {this.id = id;}@Id //第二种方法public String getName() {return name;}public void setName(String name) {this.name = name;}public String getTitle() {return title;}public void setTitle(String title) {this.title = title;}//@EmbeddedId   //使用第一种方法//public StuPk getStuPk() {//return stuPk;//}//public void setStuPk(StuPk stuPk) {//this.stuPk = stuPk;//}}

测试类


import java.util.Date;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.cfg.Configuration;import org.hibernate.service.ServiceRegistry;import org.hibernate.service.ServiceRegistryBuilder;import org.junit.AfterClass;import org.junit.Before;import org.junit.BeforeClass;import org.junit.Test;public class TestEg {private static SessionFactory sessionFactory;private static Session session;@BeforeClasspublic static  void befor() {Configuration cfg=new Configuration(); cfg.configure();        ServiceRegistry  serviceRegistry = new ServiceRegistryBuilder().applySettings(cfg.getProperties()).buildServiceRegistry();          sessionFactory=cfg.buildSessionFactory(serviceRegistry);                  session=sessionFactory.openSession();}@Testpublic void testHibernate(){Teacher s=new Teacher(); s.setTitle(Title.A);s.setName("ljf");s.setDate(new Date());        session.beginTransaction();        session.save(s);        session.getTransaction().commit();}@Testpublic void testStudent(){Student s=new Student();//StuPk stuPk=new StuPk();//stuPk.setName("ljf");//s.setStuPk(stuPk);s.setName("an");s.setTitle("title");session.beginTransaction();        session.save(s);        session.getTransaction().commit();}@AfterClasspublic static void after(){if(session!=null)session.close();if(sessionFactory!=null)sessionFactory.close();}}