Java ssh 框架 hibernate 詳細理解

Hibernate框架技術相信對大多數的 java 程序員並不陌生,數據表之間的關係如何通過Hibernate來建立,需要我們認真的分析數據表中數據項之間的交互;

數據庫表的之間的關係有:

(1)一對多(1:n)(班級:學生)

(2)多對多  (m:n)(訂單;商品)

(3)一對一 (1:1)用的 比較少 合併到 一個 表就可以達到需求

今天首先研究一下啊 

表的一對多關係

Demo :實現t_user(用戶表) 和 t_orders(訂單表)的雙向一對多關係的建表實現  {測試例:保存一個用戶 user 包含多個 orders的用戶 }

程序所有的 jar和 dtd:

 

數據庫結構圖:

)A:創建 兩個 實體:讓兩個實體之間互相的引用##

    User實體:注意 顏色文檔

複製代碼
package store_entity;
import java.sql.Timestamp;
import java.util.Set;
/**
 * 用戶類   實體類
 * @author Administrator
 *    
 */
public class User {
    private int id;
    private String username;
    private String password;
    private String nickname;
    private String email;// 激活郵件地址
    private String role;
    private int state;// 激活的狀態
    private String activecode;// 激活碼
    private Timestamp updatetime;// 時期的時間戳
    
    private Set<Orders> orders;//用戶 下的 訂單集合
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public String getNickname() {
        return nickname;
    }
    public void setNickname(String nickname) {
        this.nickname = nickname;
    }
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }
    public String getRole() {
        return role;
    }
    public void setRole(String role) {
        this.role = role;
    }
    public int getState() {
        return state;
    }
    public void setState(int state) {
        this.state = state;
    }
    public String getActivecode() {
        return activecode;
    }
    public void setActivecode(String activecode) {
        this.activecode = activecode;
    }
    public Timestamp getUpdatetime() {
        return updatetime;
    }
    public void setUpdatetime(Timestamp updatetime) {
        this.updatetime = updatetime;
    }
    @Override
    public String toString() {
        return "User [id=" + id + ", username=" + username + ", password="
                + password + ", nickname=" + nickname + ", email=" + email
                + ", role=" + role + ", state=" + state + ", activecode="
                + activecode + ", updatetime=" + updatetime + "]";
    }
    public Set<Orders> getOrders() {
        return orders;
    }
    public void setOrders(Set<Orders> orders) {
        this.orders = orders;
    }

}
複製代碼

Orders實體類 :注意顏色 文本

複製代碼
package store_entity;

import java.sql.Timestamp;
import java.util.Set;

/**
 * 
 * 訂單 實體類
 * @author Administrator
 *
 */
public class Orders {

    private String id;//數據庫 需要 自己 手動 添加 
    private String receiverinfo;//收穫地址
    private int paystate;//付款 狀態
    private Timestamp ordertime;//訂單創建 時間 
    private User user;//下單 用戶 id
    
    private Set<OrderItem> set;
    
    public Set<OrderItem> getSet() {
        return set;
    }
    public void setSet(Set<OrderItem> set) {
        this.set = set;
    }
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getReceiverinfo() {
        return receiverinfo;
    }
    public void setReceiverinfo(String receiverinfo) {
        this.receiverinfo = receiverinfo;
    }
    public int getPaystate() {
        return paystate;
    }
    public void setPaystate(int paystate) {
        this.paystate = paystate;
    }
    public Timestamp getOrdertime() {
        return ordertime;
    }
    public void setOrdertime(Timestamp ordertime) {
        this.ordertime = ordertime;
    }
    public User getUser() {
        return user;
    }
    public void setUser(User user) {
        this.user = user;
    }
    @Override
    public String toString() {
        return "Orders [id=" + id + ", receiverinfo=" + receiverinfo
                + ", paystate=" + paystate + ", ordertime=" + ordertime
                + ", user=" + user + ", set=" + set + "]";
    }

    
    
}
複製代碼

)B 配置映射文件

hibernate.cfg.xml (Hibernate配置文件)

複製代碼
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
    "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <!-- 配置連接數據庫的信息 -->
        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="connection.url">jdbc:mysql:///Estore</property>
        <property name="connection.username">root</property>
        <property name="connection.password">root</property>        
        <!-- 配置hibernate的信息  可選 -->
        <property name="current_session_context_class">thread</property>
        <!-- 數據庫方言 -->
        <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
        <!-- 輸出底層sql語句 -->
        <property name="show_sql">true</property>
        <!-- 輸出底層sql語句格式化 -->
        <property name="format_sql">true</property>
        <!-- hibernate創建表的策略  update: 沒有就創建,不一個就更新 -->
        <property name="hbm2ddl.auto">update</property>       
        <!-- 將映射文件配置到核心文件中 -->
        <mapping resource="store_entity/User.hbm.xml"/>
        <mapping resource="store_entity/Orders.hbm.xml"/>
    
    </session-factory>
</hibernate-configuration>
複製代碼

User.hbm.xml 

複製代碼
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
 <hibernate-mapping>
 <!-- 
     class標記
     name="實體類的全路徑"
     table=數據庫表名
  -->
     <class name="store_entity.User" table="t_user">
         <!-- id 表示主鍵 
             hibernate要求實體類有一個屬性爲主鍵
         -->
         <id name="id" column="user_id">
         <!-- 主鍵的生成策略
             native:生成的表id爲自增長的,它可以兼容多種數據庫
          -->
             <generator class="native"></generator>
         </id>
         <!-- 非主鍵列 
             name:實體類中的屬性名
             column:表的列名
         -->
         <property name="username" column="name" ></property>
         <property name="password" column="password" ></property>
         <property name="nickname" column="nickname" ></property>
         <property name="email" column="email" ></property>
         <property name="role" column="role" ></property>
         <property name="state" column="state" ></property>
         <property name="activecode" column="activecode" ></property>
         <property name="updatetime" column="updatetime" type="timestamp"></property>
         
         <!--外界關係 設置  -->
             <!-- 
             使用set標籤表示所有聯繫人
             name:實體類中set集合的名字
             cascade=save-update 級聯保存和更新
          -->
          <set name="orders" cascade="save-update,delete" inverse="true">
              <!-- column:外鍵列的名稱 -->
              <key column="user_id"></key>
              <!-- 包含外鍵列的表所對應的實體類 -->
              <one-to-many class="store_entity.Orders" ></one-to-many>
          </set>           
     </class>
 </hibernate-mapping>
複製代碼

Orders.hbm.xml

複製代碼
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
 <hibernate-mapping>
 <!-- 
     class標記
     name="實體類的全路徑"
     table=數據庫表名
  -->
     <class name="store_entity.Orders" table="t_orders">
         <!-- id 表示主鍵 
             hibernate要求實體類有一個屬性爲主鍵
         -->
         <id name="id" column="order_id">
         </id>
         <property name="receiverinfo" column="receiverinfo" ></property>
         <property name="paystate" column="paystate" ></property>
         <property name="ordertime" column="ordertime" type="timestamp" ></property>    
         <!-- 外鍵設置 -->
         <many-to-one name="user" class="store_entity.User" column="user_id"></many-to-one>
        <!-- 單項 一對多 -->
     </class>
 </hibernate-mapping>
複製代碼

)C 測試類編寫:

複製代碼
複製代碼
package store_utils;
import java.util.HashSet;
import java.util.Set;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import store_entity.Orders;
import store_entity.User;
public class HibernateUtils {
    private static SessionFactory factory=null;
    static{
        //1 加載配置文件(核心配置文件)
        Configuration cfg = new Configuration().configure();
        //2 創建一個SessionFactory 
        factory = cfg.buildSessionFactory();
    }    
    public static SessionFactory  getSessionFactory(){
        return factory;
    }
    public static Session getCurrentSession(){
        return factory.getCurrentSession();
    }
    public static Session getSession(){
        return factory.openSession();
    }
    public static void main(String args[]){
        //測試 存儲 用戶 和 訂單 
        User user =new User();
        user.setUsername("狗爺2");
        user.setNickname("sss");
        user.setEmail("[email protected]");
        user.setPassword("1111");
        user.setRole("1");        
        Set<Orders> set=new HashSet<Orders>();        
        Orders o1=new Orders();    
        o1.setId("1112");
        o1.setPaystate(0);
        o1.setReceiverinfo("水果w");
        o1.setUser(user);
        set.add(o1);
        user.setOrders(set);        
        Session session =null;
        Transaction ts = null;
        try{
            session = HibernateUtils.getCurrentSession();
            ts = session.beginTransaction();            
            session.save(user);
            ts.commit();//事務提交 
            System.out.println("ddddd");
        }
        catch(Exception e){
            e.printStackTrace();
            ts.rollback();
        }
    }
}

測試結果:
複製代碼

 col輸出:

 

複製代碼
發佈了10 篇原創文章 · 獲贊 6 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章