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("7168@qq.com"); 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輸出: