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();
}
}