JPA(Java Persistence API)經過註解或XML描述對象與關係表的映射關係,並將運行期的實體對象持久化到數據庫中。java
JPA是一個規範,是一個標準,Hibernate是實現了這個標準的開源框架。mysql
一、引入hibernate-jpa-2.0-api-1.0.0.Final.jar JPA規範對應的hibernate的jar包sql
二、修改配置文件hibernate.cfg.xml 的映射關係<Mapping class="">數據庫
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <!-- thread:一個線程中使用一個。獲取session會話時使用--> <property name="current_session_context_class">thread</property> <!-- 是否顯示SQL語句,值爲布爾型,默認false --> <property name="hibernate.show_sql">true</property> <!-- 是否格式化顯示sql語句,讓顯示更美觀,值爲布爾型,默認false --> <property name="hibernate.format_sql">false </property> <!-- 自動建表 update:每次執行時,無表則建表,無列則建列,只增不減 create:每次啓動的時候,刪除原表,再次建立 create-drop:每次啓動時建立新表,當顯式關閉sessionFactory時,刪除表 --> <property name="hibernate.hbm2ddl.auto">update</property> <!-- 鏈接數據庫 --> <property name="hibernate.connection.url">jdbc:mysql://127.0.0.1:3306/zxd_db</property> <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <property name="hibernate.connection.username">zxd</property> <property name="hibernate.connection.password">123456</property> <property name="dialect">org.hibernate.dialect.MySQLDialect</property> <!-- 讀取註解 --> <mapping class="demo.entity.Book" /> </session-factory> </hibernate-configuration>
三、實體配置api
package demo.entity; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.Table; import org.hibernate.annotations.GenericGenerator; /** * 註解實體配置 * JPA經過註解或XML描述對象與關係表的映射關係,並將運行期的實體對象持久化到數據庫中。 * @author Don * @date:日期:2017年4月19日 時間:上午10:43:00* * @version 1.0 */ //標註實體 @Entity //實體對應的表名,自動建庫(若不寫name,則表名與實體名保持一致) @Table(name="tb_book") public class Book { @Id @GeneratedValue(strategy=GenerationType.IDENTITY) //主鍵ID註解 private int id; @Id @GenericGenerator(name="pk_uuid",strategy="uuid") @GeneratedValue(generator="pk_uuid") //生成UUID的主鍵註解 private String uuid; @Column //列註解 private String name; @Column private double price; public int getId() { return id; } public void setId(int 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; } public String getUuid() { return uuid; } public void setUuid(String uuid) { this.uuid = uuid; } }
四、數據庫實務session建立session
package demo.util; import java.text.Annotation; import org.hibernate.SessionFactory; import org.hibernate.cfg.AnnotationConfiguration; import org.hibernate.cfg.Configuration; import org.hibernate.classic.Session; public class HibernateUtil { public static Session getCurrentSession() { /*註解調用使用AnnotationConfiguration 對象建立*/ // 加載Hibernate配置信息,默認讀取src下的hibernate.cfg.xml Configuration cfg = new AnnotationConfiguration().configure(); // 也能夠指定hibernate.cfg.xml 的路徑加載 // Configuration cfg1 = new Configuration().configure(Path); /* * 應用程序從SessionFactory(會話工廠)裏得到Session(會話)實例。它在多個應用線程間進行共享。 * 一般狀況下,整個應用只有惟一的一個會話工廠,SessionFactory由Configuration對象建立, * 每一個Hibernate配置文件,其實是對SessionFactory的配置 */ // 試用配置信息構建sessionFactory SessionFactory factory = cfg.buildSessionFactory(); Session session =factory.getCurrentSession(); return session; } }
五、測試建表和增刪改查和XML配置映射一致app
(一)、 一對一映射(主鍵關聯)框架
Card實體類ide
package demo.entity; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.OneToOne; import javax.persistence.Table; import org.hibernate.annotations.Cascade; import org.hibernate.annotations.CascadeType; import org.hibernate.annotations.GenericGenerator; import org.hibernate.annotations.Parameter; @Entity @Table(name="ann_o2o_1_Card") public class Card { @Id @GenericGenerator(name="CreateId",strategy="foreign",parameters={ @Parameter(name="property",value="person") }) @GeneratedValue(generator="CreateId") //身份證的主鍵依賴於Person private int id; @Column private String code; @OneToOne(mappedBy="card") @Cascade(CascadeType.ALL) private Person person; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getCode() { return code; } public void setCode(String card) { this.code = card; } public Person getPerson() { return person; } public void setPerson(Person person) { this.person = person; } }
Person實體類測試
package demo.entity; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.OneToOne; import javax.persistence.PrimaryKeyJoinColumn; import javax.persistence.Table; import org.hibernate.annotations.Cascade; import org.hibernate.annotations.CascadeType; @Entity @Table(name="ann_o2o_1_Person") public class Person { @Id @GeneratedValue(strategy=GenerationType.IDENTITY) private int id; @Column private String name; @OneToOne @PrimaryKeyJoinColumn @Cascade(CascadeType.ALL) //經過主鍵查詢身份證 private Card card; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Card getCard() { return card; } public void setCard(Card card) { this.card = card; } }
(二)、一對一映射(惟一外鍵)
Card實體類
package demo.entity; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.OneToOne; import javax.persistence.Table; import org.hibernate.annotations.Cascade; import org.hibernate.annotations.CascadeType; @Entity @Table(name="ann_o2o_Card") public class Card { @Id @GeneratedValue(strategy=GenerationType.IDENTITY) private int id; @Column private String code; @OneToOne @Cascade(CascadeType.ALL) @JoinColumn(name="pid",unique=true) //生成外鍵列 private Person person; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getCode() { return code; } public void setCode(String card) { this.code = card; } public Person getPerson() { return person; } public void setPerson(Person person) { this.person = person; } }
Person實體類
package demo.entity; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.OneToOne; import javax.persistence.Table; import org.hibernate.annotations.Cascade; import org.hibernate.annotations.CascadeType; @Entity @Table(name="ann_o2o_Person") public class Person { @Id @GeneratedValue(strategy=GenerationType.IDENTITY) private int id; @Column private String name; @OneToOne(mappedBy="person") @Cascade(CascadeType.ALL) private Card card; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Card getCard() { return card; } public void setCard(Card card) { this.card = card; } }
(三)、一對多映射
Classes實體類(課程)
package demo.entity; import java.util.ArrayList; import java.util.List; import javax.persistence.Column; 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="ann_m2o_Classes") public class Classes { @Id @GeneratedValue(strategy=GenerationType.IDENTITY) private int id; @Column private String name; @OneToMany(mappedBy="cal") @Cascade(CascadeType.ALL) //一對多關係配置(配置Student實體中的Class實體映射對象,設計級聯關係) private List<Student> list = new ArrayList<Student>(); public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public List<Student> getList() { return list; } public void setList(List<Student> list) { this.list = list; } }
Student實體類(學生)
package demo.entity; import javax.persistence.Column; 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; import org.hibernate.annotations.Cascade; import org.hibernate.annotations.CascadeType; @Entity @Table(name="ann_m2o_Student") public class Student { @Id @GeneratedValue(strategy=GenerationType.IDENTITY) private int id; @Column private String name; @ManyToOne @JoinColumn(name="cid") @Cascade(CascadeType.SAVE_UPDATE) private Classes cal; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Classes getCal() { return cal; } public void setCal(Classes cal) { this.cal = cal; } }
(四)、多對多映射(中間表)
Course實體類(選課)
package demo.entity; import java.util.HashSet; import java.util.Set; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.JoinTable; import javax.persistence.ManyToMany; import javax.persistence.Table; import org.hibernate.annotations.Cascade; import org.hibernate.annotations.CascadeType; import org.hibernate.annotations.GenericGenerator; /** * 課程實體 * @author Don * @date:日期:2017年4月11日 時間:下午2:25:45* * @version 1.0 */ @Entity @Table(name="ann_m2m_Course") public class Course { @Id @GenericGenerator(name="pk_key",strategy="uuid") @GeneratedValue(generator="pk_key") private String id; @Column private String name; @ManyToMany //級聯關係 @Cascade(CascadeType.SAVE_UPDATE) //中間表 @JoinTable(name="ann_m2m_stu_course", //連接當前對象的Id joinColumns={@JoinColumn(name="cid",referencedColumnName="id")}, //連接對方的表的Id inverseJoinColumns={@JoinColumn(name="stuId",referencedColumnName="id")}) private Set<Student> stus = new HashSet<>(); 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; } public Set<Student> getStus() { return stus; } public void setStus(Set<Student> stus) { this.stus = stus; } public Course(){} public Course(String name) { this.setName(name); } }
Student實體類(選課人員)
package demo.entity; import java.util.HashSet; import java.util.Set; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.JoinColumns; import javax.persistence.JoinTable; import javax.persistence.ManyToMany; import javax.persistence.Table; import org.hibernate.annotations.Cascade; import org.hibernate.annotations.CascadeType; import org.hibernate.annotations.GenericGenerator; /** * 學生實體 * @author Don * @date:日期:2017年4月11日 時間:下午2:25:15* * @version 1.0 */ @Entity @Table(name="ann_m2m_Student") public class Student { @Id //生成UUID @GenericGenerator(name="pk_key",strategy="uuid") @GeneratedValue(generator="pk_key") private String id; @Column private String name; @ManyToMany //級聯關係 @Cascade(CascadeType.SAVE_UPDATE) //中間表 @JoinTable(name="ann_m2m_stu_course", //連接當前對象的Id joinColumns={@JoinColumn(name="stuId",referencedColumnName="id")}, //連接對方的表的Id inverseJoinColumns={@JoinColumn(name="cid",referencedColumnName="id")}) private Set<Course> cous=new HashSet<>(); 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; } public Set<Course> getCous() { return cous; } public void setCous(Set<Course> cous) { this.cous = cous; } public Student() { } public Student(String name) { this.setName(name); } }