開團(tuán)先了解一番情況:
Hibernate (開放源代碼的對(duì)象關(guān)系映射框架)
POJO(Plain Ordinary Java Object):簡(jiǎn)單的Java對(duì)象
Session :會(huì)話控制
Hibernate :主鍵策略
與JDBC的優(yōu)勢(shì):
(1)連接方便:在類中映射關(guān)系即可,關(guān)閉會(huì)話而不關(guān)閉連接;
(2)使用方便:nocation幫助解決數(shù)據(jù)庫(kù)語(yǔ)句問(wèn)題知牌,需打印某列直接調(diào)用類中方法
(3)心情愉悅楼肪。
- 在Java中的連接: 配置的實(shí)體映射
//configuration(組態(tài)) : 配置數(shù)據(jù)源杆兵。
//configure( )中加載 cfg.xml 文件膜宋,傳入該文件在項(xiàng)目中的相對(duì)位置
//SessionFactory:負(fù)責(zé)初始化Hibernate ,它充當(dāng)數(shù)據(jù)庫(kù)存儲(chǔ)源的代理磷醋,線程安全
//Session :負(fù)責(zé)執(zhí)行被持久化的CRUD操作坛缕,非線程安全
①SessionFactory sf = new Configuration().configure().buildSessionFactory();
//倘若在輸入 ① ② 兩句后還是出現(xiàn)空指針錯(cuò)誤的話墓猎,就需要添加第三句,在中間:版本問(wèn)題祷膳。
③StandardServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()).build();
②Session session = sf.openSession();
對(duì)應(yīng) 的XML 文件內(nèi)容:
<!-- 實(shí)體映射 -->
<?xml version="1.0" encoding="UTF-8"?>
<hibernate-configuration>
<session-factory>
<property name="show_sql">true</property>
<!-- 配置JDBC Driver --> / 調(diào)用java中對(duì)應(yīng)的加載程序陶衅;
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<!-- 配置數(shù)據(jù)庫(kù)連接URL -->
<property name="connection.url">jdbc:mysql://localhost:3306/qingke?useSSL=false</property>
<!-- 配置數(shù)據(jù)庫(kù)連接用戶名 -->
<property name="connection.username">root</property>
<!-- 配置數(shù)據(jù)庫(kù)連接用戶密碼 -->
<property name="connection.password">xyaychA</property>
<!-- 配置hibernate使用的數(shù)據(jù)庫(kù)方言 -->
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- <mapping class="hibernate.Student"/>
<mapping resource="properties/apartment.hbm.xml"/>
// 用XML文件來(lái)反應(yīng)對(duì)象:
<mapping resource="properties/college.hbm.xml"/>
<mapping resource="properties/major.hbm.xml"/>
<mapping resource="properties/course.hbm.xml"/>-->
// 用類的映射方式關(guān)聯(lián)對(duì)象:
<mapping class="hibernate.sqlclass.Student"/>
<mapping class="hibernate.sqlclass.StudentLogin"/>
<mapping class="hibernate.sqlclass.StudentStatus"/>
<mapping class="hibernate.sqlclass.Teacher"/>
</session-factory>
</hibernate-configuration>
Hibernate :實(shí)體狀態(tài)
- 瞬時(shí)/臨時(shí)狀態(tài)(Transient) : 對(duì)象不存在與數(shù)據(jù)庫(kù) 以及session緩存中
- 持久化狀態(tài)(Persistent):對(duì)象存在于數(shù)據(jù)庫(kù)以及session緩存中
- 離線狀態(tài)(Detached):對(duì)象存在于數(shù)據(jù)庫(kù)但不存在與session緩存中屡立,即尚未被session管理直晨。
Hibernate 事務(wù)管理
- rollback ( ) 回滾搀军。
- commit ( ) 提交。
- session.save(object)
- Hibernate 增加勇皇、刪除罩句、更新
關(guān)系映射:
一:Hibernate有兩種映射實(shí)體一對(duì)一關(guān)聯(lián)關(guān)系的實(shí)現(xiàn)方式:共享主鍵方式和唯一外鍵方式。
1.共享主鍵方式:所謂共享主鍵方式就是限制兩個(gè)數(shù)據(jù)表的主鍵使用相同的值敛摘,通過(guò)主鍵形成一對(duì)一映射關(guān)系门烂。
2.唯一外鍵方式:所謂唯一外鍵方式就是一個(gè)表的外鍵和另一個(gè)表的唯一主鍵對(duì)應(yīng)形成一對(duì)一映射關(guān)系,這種一對(duì)一的關(guān)系其實(shí)就是多對(duì)一關(guān)聯(lián)關(guān)系的一種特殊情況.
二:映射多對(duì)一單向?qū)嶓w關(guān)聯(lián)關(guān)系:外鍵參照方式
//student.hbm.xml文件 XML 方式連接
<?xml version="1.0" encoding="UTF-8"?>
<hibernate-mapping>
<class name = "hibernate.sqlclass.Student" table="student">
<id name = "id" column = " id">
<generator class = "native" />
</id>
<property name = "lastname" column ="lastname"/>
<property name = "firstname" column ="firstname"/>
<property name = "password" column ="password"/>
<property name = "email" column ="email"/>
<property name = "height" column ="height"/>
<property name = "weight" column ="weight"/>
<property name = "gender" column ="gender"/>
<!-- 一對(duì)一 (StudentLogin) --> 對(duì)應(yīng)Student.class 文件中private StudentLogin login 屬性
<one-to-one name = "login" class = "hibernate.sqlclass.StudentLogin" cascade="all" />
<one-to-one name="student" class="hibernate.sqlclass.Student"/>
<!-- 多對(duì)一 name="propertiesName" column="columnName" class="className" -->
<many-to-one name = "status" column="student_status_id" class = "hibernate.sqlclass.StudentStatus" />
一對(duì)多方:
<set name = "students" table ="teacher_has_student">
<key column="teacher_id" />
<many-to-many column="student_id" class="hibernate.Student" />
</set>
<!-- 多對(duì)多 主控方 -->
<set name = "teachers" table ="teacher_has_student">
<key column ="student_id"/>
<many-to-many column ="teacher_ids" class="hibernate.Teacher"/>
</set>
<兄淫!-- 被控方 -->
<set name = "students" table ="teacher_has_student">
<key column="teacher_id" />
<many-to-many column="student_id" class="hibernate.Student" />
</set>
</class>
</hibernate-mapping>
通過(guò)類映射:@Entity @Table(name="表名") @Id 該類對(duì)應(yīng)表的主鍵 @Column 對(duì)應(yīng)的屬性屯远;
一、多對(duì)多(主控方):
@ManyToMany
@JoinTable(name="teacher_has_student", //中間表為:middle_table_name
joinColumns = @JoinColumn (name="student_id"), //主控方在中間表中的外鍵名
inverseJoinColumns = @JoinColumn (name="teacher_id")) //被控方在中間表中的外鍵名
private Set<Teacher> teachers;
(被控方): @ManyToMany ( mappingBy = "propertyName")捕虽;
二慨丐、一對(duì)多關(guān)系(雙向):
一對(duì)多:
@OneToMany,
@JoinColumn(name = "foreginKeyName ")
多對(duì)一:
@ManyToOne(),
@JoinColumn ( name = "foreginKeyName " )
三、一對(duì)一(雙向):
@OneToOne
@PrimaryKeyJoinColumn(name="id") //共享主鍵
private StudentLogin login;
@OneToOne(mappedBy= "login")
private Student student;//唯一外鍵 屬性名泄私。即:Student中private StudentLogin login;
其他
- lazy Load(延遲加載):為了減少由于大量關(guān)聯(lián)信息引起的查詢性能負(fù)擔(dān)房揭,需要時(shí)才加載。
- 級(jí)聯(lián)設(shè)置(cascade):
1.all - 所有操作都執(zhí)行級(jí)聯(lián)刪除.
2.none - 所有都不.
3.update.
4.delete. - 控制設(shè)置(inverse)
- 是否將維護(hù)關(guān)系的權(quán)利交給對(duì)方
- 默認(rèn)值為false,可選true
- 一對(duì)多關(guān)系中晌端,通常將 “一” 為true捅暴,即由 多 來(lái)維護(hù)關(guān)系
- Java Annotation中由mappedBy
- 抓取策略(fetch)