一、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();