Hibernate註解(一對1、一對多、多對多)

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;
    }
}
View Code

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;
    }
}
View Code

 (二)、一對一映射(惟一外鍵)

 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;
    }
}
View Code

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;
    }
}
View Code

 (三)、一對多映射

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;
    }
}
View Code

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;
    }
    
}
View Code

(四)、多對多映射(中間表)

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);
    }
}
View Code

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);
    }
}
View Code
相關文章
相關標籤/搜索