Hibernate4实战 之 第四部分:关系映射
数据表之间的关系分为三类:一对一、一对多、多对多一对一数据表(部门表 和 部门主管表)一对多数据表(部门表 和 部门下的人员表)多对多数据表(部门表 和 人员表)
根据相互寻找的关系又分:单向和双向对象一对一 (双向)
java代码:查看复制到剪贴板打印
- public class A {
- private B b = null; }
- public class B {
- private A a = null; }
- n对象一对多 (双向)
- public class A {
- private B b = null; }
- public class B {
- private Collection<A> colA = null; }
- n对象多对多 (双向)
- public class A {
- private Collection<B> colB = null; }
- public class B {
- private Collection<A> colA = null; }
java代码:查看复制到剪贴板打印
- <key
- column="columnname"(1)
- on-delete="noaction|cascade"(2)
- property-ref="propertyName"(3)
- not-null="true|false"(4)
- update="true|false"(5)
- unique="true|false"(6)
- />
java代码:查看复制到剪贴板打印
- <class name="Product">
- <id name="serialNumber" column="productSerialNumber"/>
- <set name="parts">
- <key column="productSerialNumber" not-null="true"/>
- <one-to-many class="Part"/>
- </set>
- </class>
java代码:查看复制到剪贴板打印
- <map
- name="propertyName" (1)
- table="table_name" (2)
- schema="schema_name" (3)
- lazy="true|extra|false" (4)
- inverse="true|false" (5)
- cascade=“all|none|save-update|delete|all-delete-orphan|delete-orphan”(6) sort="unsorted|natural|comparatorClass" (7)
- order-by="column_name asc|desc" (8)
- where="arbitrary sql where condition" (9)
- fetch="join|select|subselect" (10)
- batch-size="N" (11)
- access="field|property|ClassName" (12)
- optimistic-lock="true|false" (13)
- mutable="true|false" (14)
- >
- <key .... /> <map-key .... />
- <element .... />
- </map>
java代码:查看复制到剪贴板打印
- <key column="productSerialNumber" not-null="true"/>
java代码:查看复制到剪贴板打印
- <key column="productSerialNumber" on-delete="cascade"/>
- one-to-one
java代码:查看复制到剪贴板打印
- <one-to-one
- name="propertyName"(1)
- class="ClassName"(2)
- cascade="cascade_style"(3)
- constrained="true|false"(4)
- fetch="join|select"(5)
- property-ref="propertyNameFromAssociatedClass"(6)
- access="field|property|ClassName"(7)
- formula="any SQL expression"(8)
- lazy="proxy|no-proxy|false"(9)
- entity-name="EntityName"(10)
- />
java代码:查看复制到剪贴板打印
- <many-to-one
- name="propertyName" (1)
- column="column_name" (2)
- class="ClassName" (3)
- cascade="cascade_style"(4)
- fetch="join|select" (5)
- update="true|false" (6)
- insert="true|false" (7)
- property-ref="propertyNameFromAssociatedClass"(8)
- access="field|property|ClassName"(9)
- unique="true|false" (10)
- not-null="true|false" (11)
- optimistic-lock="true|false“ (12)
- lazy="proxy|no-proxy|false" (13)
- not-found="ignore|exception“ (14)
- entity-name="EntityName" (15)
- formula="arbitrary SQL expression"(16)
- />
java代码:查看复制到剪贴板打印
- <one-to-many
- class="ClassName"(1)
- not-found="ignore|exception"(2)
- entity-name="EntityName"(3)
- />
java代码:查看复制到剪贴板打印
- public class Parent{
- private String id;
- private String name;
- private Set children = new HashSet();
- ……
- }
- public class Child {
- private String uuid;
- private String address;
- private String postCode;
- private Parent parent;
- ……
- }
- Parent.hbm.xml:
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE hibernate-mapping PUBLIC
- "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
- "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
- <hibernate-mapping>
- <class name="cn.javass.h3.parentchild.Parent" table="tbl_parent" dynamic-update="true" dynamic-insert="true" lazy="true">
- <id name="id" column="uuid" type="java.lang.String" unsaved-value="any">
- <generator class="assigned"> </generator>
- </id>
- <property name="name" update="true" insert="true"/>
- <set name="children" inverse="true" cascade="all">
- <key column="tbl_parent_fk"/>
- <one-to-many class="cn.javass.h3.parentchild.Child"/>
- </set>
- </class>
- </hibernate-mapping>
- Child.hbm.xml:
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE hibernate-mapping PUBLIC
- "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
- "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
- <hibernate-mapping>
- <class name="cn.javass.h3.parentchild.Child" table="tbl_child" dynamic-update="true" dynamic-insert="true" lazy="true">
- <id name="uuid" column="uuid" type="java.lang.String" unsaved-value="any">
- <generator class="assigned"> </generator>
- </id>
- <property name="address" update="true" insert="true"/>
- <property name="postCode" update="true" insert="true"/>
- <many-to-one
- name="parent"
- column="tbl_Parent_fk"
- class="cn.javass.h3.parentchild.Parent"
- not-null="true"
- />
- </class>
- </hibernate-mapping>
java代码:查看复制到剪贴板打印
- <filter-def name="myFilter">
- <filter-param name="myFilterParam" type="string"/>
- </filter-def>
java代码:查看复制到剪贴板打印
- <class name="myClass" ...>
- ...
- <filter name="myFilter" condition=":myFilterParam=FILTERED_COLUMN"/>
- </class>
java代码:查看复制到剪贴板打印
- <set ...>
- <filter name="myFilter" condition=":myFilterParam=FILTERED_COLUMN"/>
- </set>
java代码:查看复制到剪贴板打印
- <filter-def name="myFilter">
- <filter-param name="myFilterParam" type="string"/>
- </filter-def>
- <filter-def name="myFilter2">
- <filter-param name="myFilterParam" type="int"/>
- <filter-param name="myFilterParam2" type="int"/>
- </filter-def>
java代码:查看复制到剪贴板打印
- <set name="children" inverse="true" cascade="all" fetch="select" lazy="false" batch-size="3">
- <key column="tbl_parent_fk"/>
- <one-to-many class="cn.javass.h3.parentchild.Child" />
- <filter name="myFilter"
- condition="address like :myFilterParam"></filter>
- <filter name="myFilter2" condition="uuid >= :myFilterParam and uuid <= :myFilterParam2"></filter>
- </set>
java代码:查看复制到剪贴板打印
- s.enableFilter("myFilter").setParameter("myFilterParam", "%1%");
- s.enableFilter("myFilter2").setParameter("myFilterParam", 1)
- .setParameter("myFilterParam2", 3);
- Query q = s.createQuery("select p from Parent as p ");
- System.out.println("p==="+p.getChildren());