映射:基本映射是對一個實體進行映射,關聯映射就是處理多個實體之間的關系,将關聯關系映射到資料庫中,所謂的關聯關系在對象模型中有一個或多個引用。資料庫表之間的關系,在建立表時,可以不指定,在Hibernate映射檔案中指定 。
一對一:一張A表中的一條記錄與另一張B表的一條記錄關聯(字段一樣),并且B表中關聯的那個字段(外鍵)受到A表主鍵的影響(删除、更新,建立)
實作方式:類(持久化類),映射檔案,配置檔案
單向:唯一外鍵關聯(建議使用)、主鍵關聯
持久化類:
public class User implements java.io.Serializable {
private Integer userid;
private String username;
//多對一單向就沒有
private Card card;//一對一
private Set card;//一對多或者多對一
}
public class Card implements java.io.Serializable {
private Integer cardid;
private Integer cardnum;
//單向就沒有其他對象的引用
private User user;//一對一雙向 或者一對多雙向
prvate Set user;//多對多雙向
}
操作類
public class HibernateUtil{
public static final SessionFactory sessionFactory;
static {
try{
sessionFactory=new Configuration().configure.buildSessionFactory();
}catch(Throwable ex){
}
}
public static final ThreadLocal session=new ThreadLocal();
public Staic Session currenSession()throws HibernateException{
Session s=(Session)session.get();
if(s==null){
s=sessionFactory.openSession();
session.set(s);
}
return s;
}
public static void closeSession()throws HibernateException{
Session s=(Session)session.get();
if(s!=null){
s.close();
session.set(null);
}
}
public class Test{
public static void main(String args[]){
Session session=Hibernate.currenSession();
Transaction tx=session.beginTransaction();
//增删改查
tx.commit();
session.close;
}??
一對一映射檔案
主鍵關聯
<hibernate-mapping>
<class name="Person" table="person">
<id name="id" column="personId">
<gernerator class="native"/>
</id>
</class>
<class name="Address" table="address">
<id name="id" column="addressId">
<gernerator class="foreign">
<param name="property">person</param>
</gernerator>
</id>
<one-to-one name="person" constrained="true"/> //constrained表示主鍵的值改變會影響外鍵
</class>??
</hibernate-mapping>
唯一外鍵關聯
<class name="Person">
<id name="id" column="personId">
<gernerator class="native"/>
</id>
<many-to-one name="address"
column="addressId"
unique="true"
not-null="true"/>
</class>
<class name="Address">
<id name="id" column="addressId">
<gernerator class="native"/>
</id>
</class>??
配置檔案
hibernate.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>
<!-- 設定資料庫URL -->
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate_first</property>
<!-- 資料庫使用者名 -->
<property name="hibernate.connection.username">root</property>
<!-- 資料庫密碼 -->
<property name="show_sql">true</property>//是否顯示SQL
<property name="format_sql">false</property>//是否格式化sql
<property name="hibernate.hbm2ddl.auto">update</property>
<!--create: 先删表,再建表。
create-drop: 啟動時建表,退出前删表。
update: 如果表結構不一緻,就建立或更新。
validate: 啟動時驗證表結構,如果不緻就抛異常-->
<property name="hibernate.connection.password">123456</property>
<!-- 指定對應資料庫的方言,hibernate為了更好适配各種關系資料庫,針對每種資料庫都指定了一個方言dialect -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- 映射檔案 -->
<mapping resource="com/liang/hibernate/User.hbm.xml"/>
一對多:一張A表中的一條記錄與另一張B表的多條記錄關聯
多對一:一張A表中的多條條記錄與另一張B表的一條記錄關聯
多對多“:一張A表中的多條條記錄與另一張B表的多條記錄關聯
注意:多對多關聯不管單向還是雙向都隻能使用連接配接表(建立第三個表),容易造成資料備援。其他一對一、多對一、一對多都可以選擇是否使用單向或者雙向連接配接表。
映射檔案解釋:
1
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 2.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">
<!-- 映射檔案開始 -->
<hibernate-mapping>
<!-- 下面的class節點定義了Province類和對應資料庫表之間的關聯關系 -->
<class name="com.xxx.hibernate.Province" table="Province" >
<!-- 下面的兩個節點定義了Province類中的屬性和該類對應資料庫表中的字段之間的關聯關系,其中Guid為對應資料庫表的主鍵 -->
<id name="guid" type="int" column="Guid">
<generator class="native" /> //主鍵外鍵
</id>
<property
name="provincename"
type="java.lang.String" //對象屬性映射關系字段
column="Provincename"
not-null="true"
length="16">
</property>
<!-- 下面的set節點定義了Province類和City類之間的”一對多“型關聯關系 -->
<set
table="" 連接配接表
name="cities"<!-- 集合屬性的名稱 -->
lazy="true"<!-- 是否允許延遲加載 -->
inverse="true"<!-- 定義這個集合是否為雙向關聯關系中的方向一端 如果教給對方,對方對外鍵所做的修改就不影響對方的主鍵 -->
cascade="delete"<!-- 定義有關操作是否關聯到子實體(此處指City類對象) -->
>
<key>
<column name="ProvinceID" /><!-- 是Province表主鍵,是city外鍵-->
</key>
<one-to-many
class="City"<!-- 定義集合所屬的類-->
/>
</set>
</class>
</hibernate-mapping>
2
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 2.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd"
>
<!-- 映射檔案開始 -->
<hibernate-mapping>
<!-- 下面的class節點定義了City類和對應資料庫表之間的關聯關系 -->
<class
name="com.xxx.hibernate.City"
table="City"
>
<!-- 下面的兩個節點定義了City類中的屬性和該類對應資料庫表中的字段之間的關聯關系,其中Guid為對應資料庫表的主鍵-->
<id
name="guid"
type="int"
column="Guid"
>
<generator class="native" />
</id>
<property
name="cityname"
type="java.lang.String"
column="Cityname"
not-null="true"
length="32"
>
</property>
<!-- 下面的many-to-one節點定義了Province類和City類之間的”一對多“型關聯關系 -->
<many-to-one
name="province"<!-- 屬性名稱 -->
class="com.xxx.hibernate.Province"<!-- 屬性所屬的類 -->
cascade="none"<!-- 指定哪些操作會從父對象(此處指City類對象)級聯到子對象(此處指Province類對象) -->
outer-join="auto"<!-- 設定父子對象之間是否存在外連接配接 -->
not-null="true"<!-- 指定該屬性是否一定為非空 -->
>
<column name="ProvinceID" /><!-- 定義父對象(此處指City類對象)所對應的資料庫表的外鍵 -->
</many-to-one>
</class>
</hibernate-mapping>
注意: inverse隻能設定一個
采用資料庫中建立表
create table Person(personId bigint not null primary)
create table PersonAddress(personId bigint not null,addrssId bigint not null,primary key(personId,addressId)
create table Address(addressId bigint not null primary key)