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; } @Override public 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; } @Override public 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,name private 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; @BeforeClass public static void befor() { Configuration cfg=new Configuration(); cfg.configure(); ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(cfg.getProperties()).buildServiceRegistry(); sessionFactory=cfg.buildSessionFactory(serviceRegistry); session=sessionFactory.openSession(); } @Test public 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(); } @Test public 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(); } @AfterClass public static void after(){ if(session!=null) session.close(); if(sessionFactory!=null) sessionFactory.close(); } }