Hibernate基礎知識(7)

一、Hibernate註解應用

1、 使用註解配置 PO對象 
      @Entity 實體類
      @Table 生成目標表
      @Id 主鍵
      @GeneratedValue 主鍵生成策略
      @Column 定義生成列

      ☆:註解開發優先使用 javax.persistence.* 包

package lsq.hibernate.domain;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

//實體類
@Entity
// 設置生成表明
@Table(name = "book")
public class Book {
	// 主鍵
	@Id
	// 主鍵生成策略
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private Integer id;
	// 普通屬性可以使用@Column註解修飾,如果不寫,列名就是屬性名
	@Column(name = "bookname", length = 20, unique = true, nullable = true)
	private String name;
	private Double price;

	public Integer getId() {
		return id;
	}

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

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public Double getPrice() {
		return price;
	}

	public void setPrice(Double price) {
		this.price = price;
	}

}
      *  @Id、@GeneratedValue、@Column  可以修改屬性,也可以放到屬性get方法上

      * 在hibernate.cfg.xml 配置註解類<mapping class="lsq.hibernate.domain.Book"/>

2、主鍵生成策略

      @GeneratedValue(strategy = GenerationType.IDENTITY) --- 只支持四種策略
編寫UUID 主鍵生成策略 Person 

package lsq.hibernate.domain;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;

import org.hibernate.annotations.GenericGenerator;

@Entity
@Table(name="person")
public class Person {
	@Id
	@GenericGenerator(name="myuuidgenerator",strategy="uuid")
	@GeneratedValue(generator="myuuidgenerator")
	private String id;//UUID
	private String name;
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	
}
3、其他屬性

      @Temporal 生成日期類型
      @Transient 控制不生成

      
      日期類型java.util.Date 對於MySQL 生成 datetime類,日期和時間都包括 
      * @Temporal(TemporalType.DATE) 數據表只保存日期
      * @Temporal(TemporalType.TIME) 數據表只保存時間
      * @Temporal(TemporalType.TIMESTAMP) 日期時間都保存 

      Hibernate 實體類中,所有get方法 屬性, 都會在數據表 自動生成列
      * 有時屬性不想 生成列  @Transient 註解

4、一對多

      配置Customer類:

 

package lsq.hibernate.domain;

import java.util.HashSet;
import java.util.Set;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;

import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.CascadeType;
@Entity
@Table(name="customers")
public class Customer {
	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	private Integer id;
	private String name;
	
	//targetEntity,類似<one-to-many class="">
	//mappedBy,作用類似inverse=true
	@OneToMany(targetEntity = Order.class, mappedBy = "customer")
	//配置級聯
	@Cascade(value={CascadeType.SAVE_UPDATE})
	private Set<Order> orders = new HashSet<Order>();
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Set<Order> getOrders() {
		return orders;
	}
	public void setOrders(Set<Order> orders) {
		this.orders = orders;
	}
	
}

      配置Orders

package lsq.hibernate.domain;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;

@Entity
@Table(name = "orders")
public class Order {
	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	private Integer id;
	private String address;
	
	@ManyToOne(targetEntity=Customer.class)
	//添加外鍵列
	@JoinColumn(name="customer_id")
	private Customer customer;

	public Integer getId() {
		return id;
	}

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

	public String getAddress() {
		return address;
	}

	public void setAddress(String address) {
		this.address = address;
	}

	public Customer getCustomer() {
		return customer;
	}

	public void setCustomer(Customer customer) {
		this.customer = customer;
	}

}
            
      ☆:jar衝突錯誤 java.lang.NoSuchMethodError: javax.persistence.OneToMany.orphanRemoval()
      * javaee.jar(myeclipse提供) 和 jpa的jar 衝突 
      * 解決 : 刪除javaee.jar 中 javax.persistence 包 

      * 級聯操作 @Cascade(value = { CascadeType.級別 })
      DELETE_ORPHAN 已經過時 ,推薦使用 @OneToMany(orphanRemoval=true) 
      所有級聯級別 
            @OneToMany(targetEntity = Order.class, mappedBy = "customer", orphanRemoval = true)
            @Cascade(value = { CascadeType.ALL })
            private Set<Order> orders = new HashSet<Order>();

5、多對多配置  

      @ManyToMany 
      * 註解配置多對多時,只需要一端配置中間表,另一端 mappedBy 放棄外鍵維護權

配置Course類:

package lsq.hibernate.domain;

import java.util.HashSet;
import java.util.Set;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import javax.persistence.Table;
@Entity
@Table(name="courses")
public class Course {
	@Id
	@GeneratedValue(strategy=GenerationType.AUTO)
	private Integer id;
	private String cname;
	
	@ManyToMany(targetEntity = Student.class,mappedBy="courses")//把外鍵維護權交給對方
	private Set<Student> students = new HashSet<Student>();

	public Integer getId() {
		return id;
	}

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

	public String getCname() {
		return cname;
	}

	public void setCname(String cname) {
		this.cname = cname;
	}

	public Set<Student> getStudents() {
		return students;
	}

	public void setStudents(Set<Student> students) {
		this.students = students;
	}

}

配置Student類:

package lsq.hibernate.domain;

import java.util.HashSet;
import java.util.Set;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.Table;
@Entity
@Table(name="students")
public class Student {
	@Id
	@GeneratedValue(strategy=GenerationType.AUTO)
	private Integer id;
	private String sname;
	
	@ManyToMany(targetEntity=Course.class)
	//配置中間表
	//joinColumns當前類在中間表中外鍵列名
	//inverseJoinColumns對方類在中間表中外鍵列名
	@JoinTable(name="student_course",joinColumns = {@JoinColumn(name="student_id")},inverseJoinColumns={@JoinColumn(name="course_id")})
	private Set<Course> courses = new HashSet<Course>();

	public Integer getId() {
		return id;
	}

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

	public String getSname() {
		return sname;
	}

	public void setSname(String sname) {
		this.sname = sname;
	}

	public Set<Course> getCourses() {
		return courses;
	}

	public void setCourses(Set<Course> courses) {
		this.courses = courses;
	}

}

      
6、 抓取策略 (瞭解)
public class Customer {
// 抓取策略
@Fetch(FetchMode.SELECT)
@LazyCollection(LazyCollectionOption.TRUE)
private Set<Order> orders = new HashSet<Order>();
}


public class Order {
// 抓取策略
@Fetch(FetchMode.SELECT)
@LazyToOne(LazyToOneOption.FALSE)
private Customer customer;
}

關聯級別抓取,配置@Fetch等價fetch屬性, 關聯集合 @LazyCollection , 關聯單一對象 @LazyToOne

7、 NamedQuery 命名查詢
@NamedQueries(value = { @NamedQuery(name = "findCustomerByName", query = "from Customer where name= ?") })
public class Customer {
...
}

程序代碼:
Query query = session.getNamedQuery("findCustomerByName");
query.setParameter(0, "張三");
Customer customer = (Customer) query.uniqueResult();








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