现在的位置: 首页 > 综合 > 正文

hibernate 之 annotation

2017年11月22日 ⁄ 综合 ⁄ 共 4672字 ⁄ 字号 评论关闭
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();
	}
	
}

抱歉!评论已关闭.