Hibernate基礎映射,hibernate映射
在說Hibernate映射前,我們先來瞭解下對象關係映射 ORM。ORM的實現思想就是將關聯式資料庫中表的資料對應成對象,以對象的形式展現。這樣開發人員就可以把對資料庫的操作轉化為對這些對象的操作。我們來看一張圖
通過該圖,我們可以看出業務實體,在資料庫中表現為關係資料,而在記憶體中表現為對象。應用程式處理對象很容易,但是很難處理關係資料。ORM做到了關係資料和對象資料之間的映射,可以通過映射關係自動產生SQL語句,在商務邏輯層和資料層之間充當橋樑。
Hibernate映射
Hibernate檔案
- 映射類(*.java):它是描述資料庫表的結構,表中的欄位在類中被描述成屬性,將來就可以實現把表中的記錄映射成為該類的對象了。
- 對應檔(*.hbm.xml):它是指定資料庫表和映射類之間的關係,包括映射類和資料庫表的對應關係、表欄位和類屬性類型的對應關係以及表欄位和類屬性名稱的對應關係等。
- 資料庫設定檔(*.properties/*.cfg.xml):它是指定與資料庫連接時需要的串連資訊,比如串連哪種資料庫、登入資料庫的使用者名稱、登入密碼以及連接字串等。當然還可以把映射類的地址映射資訊放在這裡。
基本映射:
具體看操作
1映射實體類
//預設空建構函式的重要性public class User {public User() {// TODO Auto-generated constructor stub}public User(String id,String name){this.id=id;this.name=name;}private String id;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 String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public Date getCreateTime() {return createTime;}public void setCreateTime(Date createTime) {this.createTime = createTime;}public Date getExprieTime() {return exprieTime;}public void setExprieTime(Date exprieTime) {this.exprieTime = exprieTime;}private String name;private String password;private Date createTime;private Date exprieTime;}
實體類的設計原則:
* 實現無參的預設的建構函式
* 提供一個標識
*建議不要使用final修飾實體類(因為採用load延時載入資料的時候會繼承實體類組建代理程式對象)
*建議為實體類產生getter和setter方法(如果不使用,需要用屬性field標識)
2對應檔User.hbm.xml
<?xml version="1.0"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><hibernate-mapping> <!--1、class和table的映射,name屬性是實體名,table屬性是表名(table可省略,則name即是映射的表名)--> <class name="com.bjpowernode.hibernate.User"><!-2、主鍵映射,name屬性是實體類的標識符屬性,對應table的主鍵,即用column表示(column同樣可省略)--> <id name="id" access="field"><!--主鍵產生器,class屬性工作表示建置原則,根據不同的需求選擇--> <generator class="uuid"/></id> <!--3、其他屬性的映射 property--> <property name="name" length="40" unique="true" /><property name="password"/><property name="createTime"/><property name="exprieTime"/><filter name="testFiltere" condition="id < :myid"></filter></class></hibernate-mapping>
3hibernate.cfg.xml設定檔
<!DOCTYPE hibernate-configuration PUBLIC"-//Hibernate/Hibernate Configuration DTD 3.0//EN""http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"><hibernate-configuration><session-factory><property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property><property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernast_test</property><property name="hibernate.connection.username">root</property><property name="hibernate.connection.password">hanhan</property><property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property><!--列印sql--><property name="hibernate.show_sql">true</property><!--在沒有表的時候,建立sessionfactroy 時,就會去建立表(update的方式,不刪除原有資料)--><property name="hibernate.hbm2ddl.auto">update</property><mapping resource="com/bjpowernode/hibernate/User.hbm.xml"/></session-factory></hibernate-configuration>
Hibernate的主鍵建置原則種類
手動:Assigned
Hibernate主動:uuid
資料庫互動:
需要和資料庫互動以產生id的:guid、identity、sequence、native、foreign
說明:需要和資料庫互動產生,需要經過一次查詢才能產生
Guid,identity:MySQL,SQLserver的產生方式
sequence:Oracle,db2的產生方式,自增序列
native:identity+sequence,跨平台
foreign:只適用基於共用主鍵的一對一關聯映射的時候使用。即一個對象的主鍵是參照的另一張表的主鍵產生的。
總結:
Hibernate的基本映射:重點是對主鍵建置原則的認識,根據不同資料庫選擇不同的方式,重要理解。
hibernate映射與java問題
1.hibernate映射是通過設定檔來映射的。
映射有一對一
一對多
多對多
2.注釋是“//”
3.不知道
4.設計模式
1、FACTORY—追MM少不了請吃飯了,麥當勞的雞翅和肯德基的雞翅都是MM愛吃的東西,雖然口味有所不同,但不管你帶MM去麥當勞或肯德基,只管向服務員說“來四個雞翅”就行了。麥當勞和肯德基就是生產雞翅的Factory
原廠模式:客戶類和工廠類分開。消費者任何時候需要某種產品,只需向工廠請求即可。消費者無須修改就可以接納新產品。缺點是當產品修改時,工廠類也要做相應的修改。如:如何建立及如何向用戶端提供。
2、BUILDER—MM最愛聽的就是“我愛你”這句話了,見到不同地方的MM,要能夠用她們的方言跟她說這句話哦,我有一個多種語言翻譯機,上面每種語言都有一個按鍵,見到MM我只要按對應的鍵,它就能夠用相應的語言說出“我愛你”這句話了,國外的MM也可以輕鬆搞掂,這就是我的“我愛你”builder。(這一定比美軍在伊拉克用的翻譯機好賣)
建造模式:將產品的內部表象和產品的產生過程分割開來,從而使一個建造過程產生具有不同的內部表象的產品對象。建造模式使得產品內部表象可以獨立的變化,客戶不必知道產品內部組成的細節。建造模式可以強制實行一種分步驟進行的建造過程。
3、FACTORY METHOD—請MM去麥當勞吃漢堡,不同的MM有不同的口味,要每個都記住是一件煩人的事情,我一般採用Factory Method模式,帶著MM到服務員那兒,說“要一個漢堡”,具體要什麼樣的漢堡呢,讓MM直接跟服務員說就行了。
Factory 方法模式:核心工廠類不再負責所有產品的建立,而是將具體建立的工作交給子類去做,成為一個抽象工廠角色,僅負責給出具體工廠類必須實現的介面,而不接觸哪一個產品類應當被執行個體化這種細節。
4、PROTOTYPE—跟MM用QQ聊天,一定要說些深情的話語了,我搜集了好多肉麻的情話,需要時只要copy出來放到QQ裡面就行了,這就是我的情話prototype了。(100塊錢一份,你要不要)
原始模型模式:通過給出一個原型對象來指明所要建立的對象的類型,然後用複製這個原型對象的方法建立出更多同類型的對象。原始模型模式允許動態增加或減少產品類,產品類不需要非得有任何事先確定的等級結構,原始模型模式適用於任何的等級結構。缺點是每一個類都必須配備一個複製方法。
5、SINGLETON—俺有6個漂亮的老婆,她們的老公都是我,我就是我們家裡的老公Sigleton,她們只要說道“老公”,都是指的同一個人,那就是我(剛才做了個夢啦,哪有這麼好的事)
單例模式:單例模式確保某一個類只有一個執行個體,而且自行執行個體化並向整個系統提供這個執行個體單例模式。單例模式只應在有真正的“單一執行個體”的需求時才可使用。
[b:9ceca65206]結構型模式[/b:9ceca65206]
6、ADAPTER—在朋友聚會上碰到了一個美女Sarah,從香港來的,可我不會說粵語,她不會說普通話,只好求助於我的朋友kent了,他作為我和Sarah之間的Adapter,讓我和Sarah可以相互交談了(也不知道他會不會耍我)
適配器(變壓器)模式:把一個類的介面變換成用戶端所期待的另一種介面,從而使原本因介面原因不匹配而無法一起工作的兩個類能夠一起工作。適配類可以根據參數返還一個合適的執行個體給用戶端。
7、BRIDGE—早上碰到MM,要說早上......餘下全文>>
Hibernate關係映射問題
基本上都比較常用,非說那個不常用的話一對一用得可能能少點,下面說下我的理解,我盡量說通俗點
我下面就舉幾個例子你就明白了:
1、一對一,比如一個表的欄位有100多個,而且其中有40個其他表可能有用,那麼你把這個表拆分成兩個表,並且兩個表中的資料都是一條記錄對應一條記錄,某一個表中存放另一個對應表的id用來維護兩個記錄之間的關係,因為本來這兩條記錄原來就是一條記錄,不知道這麼說你能明白嗎?
2、一對多,如:部門表與使用者表,一個部門是不是有多個使用者,但是一個使用者有且只有一個部門,很清晰了吧
3、多對一,相當於吧部門表與使用者表打顛倒
4、多對多,其實就是一對多與多對一結合起來實現的關係,如使用者表與許可權表,一個使用者有多個許可權,而一個許可權同時對應多個使用者,兩個結合起來就是多對多
5、單向雙向只是hibernate的概念,比如你這兩個表A---表B,這樣通過表A來維護表B的資料,但是表B不能維護表A,這就是單項,雙向現在應該就好解釋了,通過兩個表都可以相互管理對方的資料。書面點,單項就是由父類管理關聯關係,子類無法管理,雙向父類子類都可管理。
hibernate提出的這些關係都有相應的配置,其實這些關係在資料庫中一直是存在的,只是hibernate對這些關係都通過不同的配置實現,單向和雙向也有相應的配置,這些功能當然也可以不通過hibernate配置實現,自己在代碼中維護這塊關係也可以,單雙向,資料庫中沒有類似相關概念,hibernate提出這塊功能,我們可以通過配置完成他們的限制功能。想想如果我們代碼只提供使用者表管理部門表的功能,不給通過部門系統管理使用者的方法,那麼這是不是就類似於hibernate的單向概念呢?
時間有限就說這麼多,都是自己在項目中的一些積累,可能有些地方理解不夠深刻,包含包含