Hibernate_使用註解

Hibernate註解編程
<!-- EJB註解編程 -->
<hibernate-configuration>
	<session-factory>
		<property name="hibernate.connection.url">
			jdbc:mysql://localhost:3306/test
		</property>
		<property name="hibernate.connection.driver_class">
			com.mysql.jdbc.Driver
		</property>
		<property name="hibernate.connection.username">root</property>
		<property name="hibernate.connection.password">imti</property>
		<property name="hibernate.dialect">
			org.hibernate.dialect.MySQLDialect
		</property>
		<mapping class="com.xmxz.hibernate.annotation.IdCard" />
		<mapping class="com.xmxz.hibernate.annotation.Person" />
	</session-factory>
</hibernate-configuration>

<!—XML映射 -->
<hibernate-configuration>
	<session-factory>
		<property name="hibernate.connection.url">
			jdbc:mysql://localhost:3306/test
		</property>
		<property name="hibernate.connection.driver_class">
			com.mysql.jdbc.Driver
		</property>
		<property name="hibernate.connection.username">root</property>
		<property name="hibernate.connection.password">imti</property>
		<property name="hibernate.dialect">
			org.hibernate.dialect.MySQLDialect
		</property>
		<property name="hibernate.show_sql">true</property>
		<property name="hibernate.hbm2ddl.auto">update</property>
		<mapping resource="com/xmxz/hibernate/mobile/Operator.hbm.xml" />
		<mapping
			resource="com/xmxz/hibernate/mobile/MobileUser.hbm.xml" />
		<mapping
			resource="com/xmxz/hibernate/mobile/FillMoneyCard.hbm.xml" />
		<mapping resource="com/xmxz/hibernate/mobile/SPConst.hbm.xml" />
		<mapping resource="com/xmxz/hibernate/mobile/MobileSP.hbm.xml" />
		<mapping
			resource="com/xmxz/hibernate/mobile/FillMoneyHistory.hbm.xml" />
		<mapping resource="com/xmxz/hibernate/mobile/Message.hbm.xml" />
	</session-factory>
</hibernate-configuration>
ExportDB
public class ExportDB {
	public static void main(String[] args) {
		// 讀取hibernate.cfg.xml文件
Configuration cfg = new Configuration() .configure("");
		SchemaExport export = new SchemaExport(cfg);
		export.create(true, true);
	}
}

HibernateUtils
public class HibernateUtils {
	private static SessionFactory factory;
	static {// 單例模式
		try {
			Configuration cfg = new Configuration().configure();
			factory = cfg.buildSessionFactory();
		} catch (HibernateException e) {
			e.printStackTrace();
		}
	}
	/**
	 * 獲取當前的會話工廠
	 * @return
	 */
	public static SessionFactory getSessionFactory() {
		return factory;
	}
	/**
	 * 獲取當前的會話
	 * @return
	 */
	public static Session getSession() {
		return factory.openSession();
	}
	/**
	 * 關閉會話(session)
	 * @param session當前的會話
	 */
	public static void closeSession(Session session) {
		if (session != null) {
			if (session.isOpen()) {
				session.close();
			}
		}
	}
}


ExportDBAnnotation
public class ExportDBAnnotation {
	public static void main(String[] args) {
		// 讀取hibernate.cfg.annotation.xml文件
		Configuration cfg = new AnnotationConfiguration()
				.configure("hibernate.cfg.annotation.xml");
		SchemaExport export = new SchemaExport(cfg);
		// export.setFormat(true);
		// 設置保存SQL腳本的文件名
		// export.setOutputFile("new.sql");
		// 輸出SQL腳本,並執行SQL腳本
		export.create(true, true);
	}
}

HibernateAnnotationUtils
/**
 * 使用EJB註解做的
 * @author Administrator
 */
public class HibernateAnnotationUtils {
	private static SessionFactory factory;
	static {// 單例模式
		try {
			Configuration cfg = new AnnotationConfiguration()
					.configure("hibernate.cfg.annotation.xml");
			factory = cfg.buildSessionFactory();
		} catch (HibernateException e) {
			e.printStackTrace();
		}
	}
	
	public static SessionFactory getSessionFactory() {
		return factory;
	}
	
	public static Session getSession() {
		return factory.openSession();
	}

	public static void closeSession(Session session) {
		if (session != null) {
			if (session.isOpen()) {
				session.close();
			}
		}
	}
}
【一對一】關係映射
模型:人 和 身份證  通過人可以得知身份證號碼,根據身份證號碼可以得知人
Person
/**
 * 人(通過外鍵實現一對一關係)
 * @author Administrator
 */
// 屏蔽缺少“serialVersionUID”定義警告
@SuppressWarnings("serial")
// 指明實體Bean名,默認值是類名
@Entity(name = "Person")
// 實體對應的數據表 name表名;uniqueConstraints唯一約束性;主鍵
@Table(name = "t_person", uniqueConstraints = { @UniqueConstraint(columnNames = { "id" }) })
public class Person implements Serializable {
	private Integer id;
	private String name;
	private IdCard idCard;
	@Id
	// 主鍵唯一標識
	@Column(name = "id")
	// 字段名
	@GeneratedValue(strategy = GenerationType.AUTO)
	// 自動增加
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	@Column(name = "name", length = 16, nullable = false)
	//name字段名,length字段最大字符長度,nullable是否允許爲空,precision字段精度,scale小數位數
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	//optional是否允許該字段爲null,該屬性應該根據數據庫表的外鍵約束來確定,默認爲true
	@JoinColumn(name = "cardID")
	@OneToOne(cascade = CascadeType.ALL, optional = false)
	public IdCard getIdCard() {
		return idCard;
	}
	public void setIdCard(IdCard idCard) {
		this.idCard = idCard;
	}
}

IdCard
/**
 * 身份證(通過外鍵實現一對一關係)
 * @author Administrator
 */
// 屏蔽缺少“serialVersionUID”定義警告
@SuppressWarnings("serial")
// 指明實體Bean名,默認值是類名
@Entity(name = "IdCard")
// 實體對應的數據表 name表名;uniqueConstraints唯一約束性;主鍵
@Table(name = "t_idcard", uniqueConstraints = { @UniqueConstraint(columnNames = { "id" }) })
public class IdCard implements Serializable {	
	private Integer id;
	private String cardNo;
	private Person person;
	@Id
	// 主鍵唯一標識
	@Column(name = "id")
	// 字段名
	@GeneratedValue(strategy = GenerationType.AUTO)
	// 自動增加
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	@Column(name = "cardNo", length = 32, nullable = false)
	//name字段名,length字段最大字符長度,nullable是否允許爲空,precision字段精度,scale小數位數
	public String getCardNo() {
		return cardNo;
	}
	public void setCardNo(String cardNo) {
		this.cardNo = cardNo;
	}
	// 表示該屬性並非一個到數據庫表的字段的映射,ORM框架將忽略該屬性
	@OneToOne(cascade = { CascadeType.PERSIST, CascadeType.MERGE }, mappedBy = "idCard")
	public Person getPerson() {
		return person;
	}
	public void setPerson(Person person) {
		this.person = person;
	}
}




【一對一】測試類
OneToOneTest
/**
 * 一對一關係映射(雙向)唯一外鍵關聯
 * @author Administrator
 */
public class OneToOneTest extends TestCase {
	public void testSave() {
		Session session = null;
		Transaction tx = null;
		try {
			session = HibernateAnnotationUtils.getSession();
			tx = session.beginTransaction();// 開啓事務
			IdCard idCard = new IdCard();
			idCard.setCardNo("210211197809204977");
			session.save(idCard);// ※※※※※
			Person person = new Person();
			person.setName("馬遠志");
			person.setIdCard(idCard);
			session.save(person);
			// 事務提交
			tx.commit();
		} catch (HibernateException e) {
			e.printStackTrace();
			// 事務回滾
			tx.rollback();
		} finally {
			// 關閉會話
			HibernateAnnotationUtils.closeSession(session);
		}
	}

	public void testLoad() {
		Session session = null;
		Transaction tx = null;
		try {
			session = HibernateAnnotationUtils.getSession();
			tx = session.beginTransaction();// 開啓事務
			Person person = (Person) session.load(Person.class, 1);
			System.out.println("姓名:" + person.getName());
			System.out.println("身份證:" + person.getIdCard().getCardNo());
			tx.commit();
		} catch (HibernateException e) {
			e.printStackTrace();
			tx.rollback();
		} finally {
			HibernateAnnotationUtils.closeSession(session);
		}
	}
	public void testLoad1() {
		Session session = null;
		Transaction tx = null;
		try {
			session = HibernateAnnotationUtils.getSession();
			tx = session.beginTransaction();// 開啓事務
			IdCard idCard = (IdCard) session.load(IdCard.class, 1);
			System.out.println("身份證:" + idCard.getCardNo());
			System.out.println("姓名:" + idCard.getPerson().getName());
			tx.commit();
		} catch (HibernateException e) {
			e.printStackTrace();
			tx.rollback();
		} finally {
			HibernateAnnotationUtils.closeSession(session);
		}
	}
}

【一對多】關係映射
模型:班級 和 學生  一個班級有多名學生,一個學生屬於某個班級
Classes
/**
 * 班級
 * @author Administrator
 */
// 屏蔽缺少“serialVersionUID”定義警告
@SuppressWarnings("serial")
// 指明實體Bean名,默認值是類名
@Entity(name = "Classes")
// 實體對應的數據表 name表名;uniqueConstraints唯一約束性;主鍵
@Table(name = "t_classes", uniqueConstraints = { @UniqueConstraint(columnNames = { "id" }) })
public class Classes implements Serializable {
	private Integer id;
	private String name;
	private Set students;
	@Id
	// 主鍵唯一標識
	@Column(name = "id")
	// 字段名
	@GeneratedValue(strategy = GenerationType.AUTO)
	// 自動增加
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	@Column(name = "name", length = 16, nullable = false)
	//name字段名,length字段最大字符長度,nullable是否允許爲空,precision字段精度,scale小數位數
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	@OneToMany(fetch = FetchType.LAZY, cascade = { CascadeType.ALL }, targetEntity = Student.class, mappedBy = "classes")
	public Set getStudents() {
		return students;
	}
	public void setStudents(Set students) {
		this.students = students;
	}
}

Student
/**
 * 學生
 * @author Administrator
 */
// 屏蔽缺少“serialVersionUID”定義警告
@SuppressWarnings("serial")
// 指明實體Bean名,默認值是類名
@Entity(name = "Student")
// 實體對應的數據表 name表名;uniqueConstraints唯一約束性;主鍵
@Table(name = "t_student", uniqueConstraints = { @UniqueConstraint(columnNames = { "id" }) })
public class Student implements Serializable {
	private Integer id;
	private String name;
	private Date createTime;
	private Classes classes;
	@Id
	// 主鍵唯一標識
	@Column(name = "id")
	// 字段名
	@GeneratedValue(strategy = GenerationType.AUTO)
	// 自動增加
	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	@Column(name = "name", length = 16, nullable = false)
	//name字段名,length字段最大字符長度,nullable是否允許爲空,precision字段精度,scale小數位數
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	// optional是否允許該字段爲null,該屬性應該根據數據庫表的外鍵約束來確定,默認爲true
	@ManyToOne(fetch = FetchType.EAGER, cascade = { CascadeType.ALL }, optional = true)
	@JoinColumn(name = "classesid")
	public Classes getClasses() {
		return classes;
	}
	public void setClasses(Classes classes) {
		this.classes = classes;
	}
	@Column(name = "createTime")
	// 字段名稱
	@Temporal(TemporalType.TIMESTAMP)
	// 日期型字段:日期時間型
	// @Temporal(TemporalType.DATE)
	public Date getCreateTime() {
		return createTime;
	}
	public void setCreateTime(Date createTime) {
		this.createTime = createTime;
	}
}
【一對多】測試類
初始化數據
InitData
/**
 * 初始化數據
 * @author Administrator
 */
public class InitData {
	public static void main(String[] args) {
		Session session = null;
		Transaction tx = null;
		try {
			session = HibernateAnnotationUtils.getSession();
			tx = session.beginTransaction();// 開啓事務
			for (int i = 0; i < 10; i++) {
				Classes classes = new Classes();
				classes.setName("班級" + i);
				session.save(classes);
				for (int j = 0; j < 10; j++) {
					Student student = new Student();
					student.setName("班級" + i + "的學生" + j);
					student.setCreateTime(randomDate("2008-01-01","2008-03-01"));
					// 在內存中建立由student指向classes的引用
					student.setClasses(classes);
					session.save(student);
				}
			}
			for (int i = 0; i < 5; i++) {
				Classes classes = new Classes();
				classes.setName("無學生班級" + i);
				session.save(classes);
			}
			for (int i = 0; i < 10; i++) {
				Student student = new Student();
				student.setName("無業遊民" + i);
				session.save(student);
			}
			// 事務提交
			tx.commit();
		} catch (Exception e) {
			e.printStackTrace();
			// 事務回滾
			tx.rollback();
		} finally {
			// 關閉會話
			HibernateAnnotationUtils.closeSession(session);
		}
	}
	/**
	 * 獲取隨機日期
	 * @param beginDate起始日期,格式爲:yyyy-MM-dd
	 * @param endDate結束日期,格式爲:yyyy-MM-dd
	 * @return
	 */
	private static Date randomDate(String beginDate, String endDate) {
		try {
			DateFormat format = new SimpleDateFormat("yyyy-MM-dd");
			Date start = format.parse(beginDate);
			Date end = format.parse(endDate);
			if (start.getTime() >= end.getTime()) {
				return null;
			}
			long date = random(start.getTime(), end.getTime());
			return new Date(date);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}

	/**
	 * 產生隨機數
	 * @param begin
	 * @param end
	 * @return
	 */
	private static long random(long begin, long end) {
		long rtn = begin + (long) (Math.random() * (end - begin));
		if (rtn == begin || rtn == end) {
			return random(begin, end);
		}
		return rtn;
	}
}
OneToManyTest
public class OneToManyTest extends TestCase {
	public void testLoad1() {
		Session session = null;
		Transaction tx = null;
		try {
			session = HibernateAnnotationUtils.getSession();
			tx = session.beginTransaction();// 開啓事務
			Classes classes = (Classes) session.load(Classes.class, 1);
			System.out.println("班級名稱:" + classes.getName());
			Set students = classes.getStudents();
			for (Iterator iter = students.iterator(); iter.hasNext();) {
				Student student = (Student) iter.next();
				System.out.println("姓名:" + student.getName());
			}
			tx.commit();
		} catch (HibernateException e) {
			e.printStackTrace();
			tx.rollback();
		} finally {
			HibernateAnnotationUtils.closeSession(session);
		}
	}
	public void testLoad2() {
		Session session = null;
		Transaction tx = null;
		try {
			session = HibernateAnnotationUtils.getSession();
			tx = session.beginTransaction();// 開啓事務
			Student student = (Student) session.load(Student.class, 1);
			System.out.println("姓名:" + student.getName());
			System.out.println("班級名稱:" + student.getClasses().getName());
			tx.commit();
		} catch (Exception e) {
			e.printStackTrace();
			tx.rollback();
		} finally {
			HibernateAnnotationUtils.closeSession(session);
		}
	}
}
【多對多】關係映射
模型:用戶 和 角色   一個用戶擁有多個角色,一個角色中存在多個用戶
Role
/**
 * 角色對象 被關係維護端
 * @author Administrator
 */
// 屏蔽缺少“serialVersionUID”定義警告
@SuppressWarnings("serial")
// 指明實體Bean名,默認值是類名
@Entity(name = "Role")
// 實體對應的數據表 name表名;uniqueConstraints唯一約束性;主鍵
@Table(name = "t_roles", uniqueConstraints = { @UniqueConstraint(columnNames = { "id" }) })
public class Role {
	private int id;
	private String name;
	private Set users;
	@Id
	// 主鍵唯一標識
	@Column(name = "id")
	// 字段名
	@GeneratedValue(strategy = GenerationType.AUTO)
	// 自動增加
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	@Column(name = "name", length = 16, nullable = false)
	//name字段名,length字段最大字符長度,nullable是否允許爲空,precision字段精度,scale小數位數
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	//被關係維護端
	@ManyToMany(cascade=CascadeType.REFRESH,mappedBy="roles",targetEntity=User.class)
	public Set getUsers() {
		return users;
	}

	public void setUsers(Set users) {
		this.users = users;
	}
}
User
/**
 * 用戶對象
 * @author Administrator
 */
// 屏蔽缺少“serialVersionUID”定義警告
@SuppressWarnings("serial")
// 指明實體Bean名,默認值是類名
@Entity(name = "User")
// 實體對應的數據表 name表名;uniqueConstraints唯一約束性;主鍵
@Table(name = "t_user", uniqueConstraints = { @UniqueConstraint(columnNames = { "id" }) })
public class User {
	private int id;
	private String name;
	private Set roles;
	@Id
	// 主鍵唯一標識
	@Column(name = "id")
	// 字段名
	@GeneratedValue(strategy = GenerationType.AUTO)
	// 自動增加
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	@Column(name = "name", length = 16, nullable = false)
	//name字段名,length字段最大字符長度,nullable是否允許爲空,precision字段精度,scale小數位數
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	// 設置關聯表
	// inverseJoinColumns 被關係維護端在關聯表中的外鍵
	// joinColumns 關係維護端在關聯表中的外鍵
	@JoinTable(name = "t_role_user", inverseJoinColumns = @JoinColumn(name = "roleID"), joinColumns = @JoinColumn(name = "userID"))
	@ManyToMany(cascade = CascadeType.REFRESH,targetEntity=Role.class)
	public Set getRoles() {
		return roles;
	}

	public void setRoles(Set roles) {
		this.roles = roles;
	}
}
【多對多】測試類
ManyToManyTest
/**
 * 多對多關聯映射(雙向)
 * @author Administrator
 */
public class ManyToManyTest extends TestCase {
	public void testSave() {
		Session session = null;
		Transaction tx = null;
		try {
			session = HibernateAnnotationUtils.getSession();
			tx = session.beginTransaction();// 開啓事務
			Role r1 = new Role();
			r1.setName("數據錄入人員");
			session.save(r1);

			Role r2 = new Role();
			r2.setName("商務主管");
			session.save(r2);

			Role r3 = new Role();
			r3.setName("總經理");
			session.save(r3);

			User u1 = new User();
			u1.setName("張三");
			Set u1Roles = new HashSet();
			u1Roles.add(r1);
			u1Roles.add(r2);
			u1.setRoles(u1Roles);

			User u2 = new User();
			u2.setName("李四");
			Set u2Roles = new HashSet();
			u2Roles.add(r2);
			u2Roles.add(r3);
			u2.setRoles(u2Roles);

			User u3 = new User();
			u3.setName("王五");
			Set u3Roles = new HashSet();
			u3Roles.add(r1);
			u3Roles.add(r2);
			u3Roles.add(r3);
			u3.setRoles(u3Roles);

			session.save(u1);
			session.save(u2);
			session.save(u3);

			// 事務提交
			tx.commit();
		} catch (Exception e) {
			e.printStackTrace();
			// 事務回滾
			tx.rollback();
		} finally {
			// 關閉會話
			HibernateAnnotationUtils.closeSession(session);
		}
	}

	public void testLoad() {
		Session session = null;
		Transaction tx = null;
		try {
			session = HibernateAnnotationUtils.getSession();
			tx = session.beginTransaction();// 開啓事務
			User user = (User) session.load(User.class, 1);
			System.out.println(user.getName());
			for (Iterator iter = user.getRoles().iterator(); iter.hasNext();) {
				Role role = (Role) iter.next();
				System.out.println(role.getName());
			}
			// 事務提交
			tx.commit();
		} catch (Exception e) {
			e.printStackTrace();
			// 事務回滾
			tx.rollback();
		} finally {
			// 關閉會話
			HibernateAnnotationUtils.closeSession(session);
		}
	}

	public void testLoad1() {
		Session session = null;
		Transaction tx = null;
		try {
			session = HibernateAnnotationUtils.getSession();
			tx = session.beginTransaction();// 開啓事務
			Role role = (Role) session.load(Role.class, 1);
			System.out.println(role.getName());
			for (Iterator iter = role.getUsers().iterator(); iter.hasNext();) {
				User user = (User) iter.next();
				System.out.println(user.getName());
			}
			// 事務提交
			tx.commit();
		} catch (Exception e) {
			e.printStackTrace();
			// 事務回滾
			tx.rollback();
		} finally {
			// 關閉會話
			HibernateAnnotationUtils.closeSession(session);
		}
	}
}
【component組件】關係映射
模型:員工和用戶都存在公共的屬性:電子郵件、聯繫地址、郵政編碼、聯繫電話
Contact
/**
 * 公共部分 component(組件、部分)映射
 * @author Administrator
 */
@Embeddable
// 表明該類將作爲一個組件類型
public class Contact {
	private String email;// 電子郵件
	private String address;// 聯繫地址
	private String zipCode;// 郵政編碼
	private String contactTel;// 聯繫電話
	public Contact() {

	}
	public Contact(String email, String address, String zipCode,
			String contactTel) {
		this.email = email;
		this.address = address;
		this.zipCode = zipCode;
		this.contactTel = contactTel;
	}
	@Column(name = "email", length = 64, nullable = true)
	public String getEmail() {
		return email;
	}
	public void setEmail(String email) {
		this.email = email;
	}

	@Column(name = "address", length = 64, nullable = true)
	public String getAddress() {
		return address;
	}
	public void setAddress(String address) {
		this.address = address;
	}
	@Column(name = "zipCode", length = 6, nullable = true)
	public String getZipCode() {
		return zipCode;
	}
	public void setZipCode(String zipCode) {
		this.zipCode = zipCode;
	}
	@Column(name = "contactTel", length = 32, nullable = true)
	public String getContactTel() {
		return contactTel;
	}
	public void setContactTel(String contactTel) {
		this.contactTel = contactTel;
	}
}
Employee
/**
 * 用戶 component(組件、部分)映射
 * @author Administrator
 */
// 屏蔽缺少“serialVersionUID”定義警告
@SuppressWarnings("serial")
// 指明實體Bean名,默認值是類名
@Entity(name = "Employee")
// 實體對應的數據表 name表名;uniqueConstraints唯一約束性;主鍵
@Table(name = "t_employee", uniqueConstraints = { @UniqueConstraint(columnNames = { "id" }) })
public class Employee {
	private int id;
	private String name;
	// 組件類型
	@Embedded
	private Contact contact;
	@Id
	// 主鍵唯一標識
	@Column(name = "id")
	// 字段名
	@GeneratedValue(strategy = GenerationType.AUTO)
	// 自動增加
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	@Column(name = "name", length = 16, nullable = false)
	//name字段名,length字段最大字符長度,nullable是否允許爲空,precision字段精度,scale小數位數
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}

	public Contact getContact() {
		return contact;
	}
	public void setContact(Contact contact) {
		this.contact = contact;
	}
}
【component組件】測試類
ComponentTest
/**
 * component(組件、部分)映射
 * @author Administrator
 */
public class ComponentTest extends TestCase {
	public void testSave() {
		Session session = null;
		Transaction tx = null;
		try {
			session = HibernateAnnotationUtils.getSession();
			tx = session.beginTransaction();// 開啓事務
			Employee user = new Employee();
			user.setName("張三");
			Contact contact = new Contact();
			contact.setAddress("xxxxx");
			contact.setEmail("[email protected]");
			contact.setZipCode("111000");
			contact.setContactTel("13555811111");
			user.setContact(contact);
			session.save(user);
			// 事務提交
			tx.commit();
		} catch (Exception e) {
			e.printStackTrace();
			// 事務回滾
			tx.rollback();
		} finally {
			// 關閉會話
			HibernateAnnotationUtils.closeSession(session);
		}
	}
	public void testLoad() {
		Session session = null;
		Transaction tx = null;
		try {
			session = HibernateAnnotationUtils.getSession();
			tx = session.beginTransaction();// 開啓事務
			Employee user = (Employee) session.load(Employee.class, 1);
			System.out.println("姓名:" + user.getName());
			System.out.println("地址:" + user.getContact().getAddress());
			// 事務提交
			tx.commit();
		} catch (Exception e) {
			e.printStackTrace();
			// 事務回滾
			tx.rollback();
		} finally {
			// 關閉會話
			HibernateAnnotationUtils.closeSession(session);
		}
	}
}
【composite複合主鍵】關係映射
模型:員工發放工資,按年按月發放工資,年月做一個複合主鍵
WagePK     此類必須實現Serializable接口,重寫hashCode和equals方法
/**
 * 複合主鍵映射
 * @author Administrator
 */
public class WagePK implements Serializable {
	// 工資年
	private int wageYear;
	// 工資月
	private int wageMonth;
	@Column(name = "wageYear", nullable = false)
	public int getWageYear() {
		return wageYear;
	}
	public void setWageYear(int wageYear) {
		this.wageYear = wageYear;
	}
	@Column(name = "wageMonth", nullable = false)
	public int getWageMonth() {
		return wageMonth;
	}
	public void setWageMonth(int wageMonth) {
		this.wageMonth = wageMonth;
	}
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + wageMonth;
		result = prime * result + wageYear;
		return result;
	}
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		final WagePK other = (WagePK) obj;
		if (wageMonth != other.wageMonth)
			return false;
		if (wageYear != other.wageYear)
			return false;
		return true;
	}
}
Wage
/**
 * 工資
 * @author 馬遠志
 */
// 屏蔽缺少“serialVersionUID”定義警告
@SuppressWarnings("serial")
// 指明實體Bean名,默認值是類名
@Entity(name = "Wage")
// 複合主鍵的實體類
@IdClass(WagePK.class)
// 實體對應的數據表 name表名;uniqueConstraints唯一約束性;主鍵
@Table(name = "t_wage")
public class Wage {
	// 工資年
	@Id
	private int wageYear;
	// 工資月
	@Id
	private int wageMonth;
	// 開工資日期
	private Date createDate;
	// 工資金額
	private float money;

	public int getWageYear() {
		return wageYear;
	}
	public void setWageYear(int wageYear) {
		this.wageYear = wageYear;
	}

	public int getWageMonth() {
		return wageMonth;
	}
	public void setWageMonth(int wageMonth) {
		this.wageMonth = wageMonth;
	}
	@Column(name = "createDate")
	// 字段名稱
	@Temporal(TemporalType.DATE)
	// 日期型字段:日期
	// @Temporal(TemporalType.TIMESTAMP)
	public Date getCreateDate() {
		return createDate;
	}
	public void setCreateDate(Date createDate) {
		this.createDate = createDate;
	}
	@Column(name = "money", nullable = false)
	public float getMoney() {
		return money;
	}
	public void setMoney(float money) {
		this.money = money;
	}
}
【composite複合主鍵】測試類
CompositeTest
/**
 * 複合組件映射
 * @author Administrator
 */
public class CompositeTest extends TestCase {

	public void testSave() {
		Session session = null;
		Transaction tx = null;
		try {
			session = HibernateAnnotationUtils.getSession();
			tx = session.beginTransaction();// 開啓事務
			Wage wage = new Wage();
			wage.setWageYear(2008);
			wage.setWageMonth(8);
			wage.setCreateDate(new Date());
			wage.setMoney(500.5f);
			session.save(wage);
			// 事務提交
			tx.commit();
		} catch (Exception e) {
			e.printStackTrace();
			// 事務回滾
			tx.rollback();
		} finally {
			// 關閉會話
			HibernateAnnotationUtils.closeSession(session);
		}
	}

	public void testLoad() {
		Session session = null;
		Transaction tx = null;
		try {
			session = HibernateAnnotationUtils.getSession();
			tx = session.beginTransaction();// 開啓事務
			WagePK pk = new WagePK();
			pk.setWageYear(2008);
			pk.setWageMonth(8);
			Wage wage = (Wage) session.load(Wage.class, pk);
			System.out.println("開資日期:" + wage.getCreateDate());
			System.out.println("金額:" + wage.getMoney());
			// 事務提交
			tx.commit();
		} catch (Exception e) {
			e.printStackTrace();
			// 事務回滾
			tx.rollback();
		} finally {
			// 關閉會話
			HibernateAnnotationUtils.closeSession(session);
		}
	}
}

使用的jar包:ejb3-persistence.jar、hibernate-annotations.jar、hibernate-commons-annotations.jar、antlr-2.7.6.jar、commons-collections-3.1.jar、dom4j-1.6.1.jar、hibernate3.jar、javassist-3.4.GA.jar、jta-1.1.jar、log4j-1.2.16.jar、slf4j-api-1.6.4.jar、slf4j-log4j12-1.6.4.jar


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章