hibernate ORM related

一、单向关联(unidirectional associations):

1.1.1 Many-to-one

Employee.hbm.xml
<class name="Employee" table="T_EMPLOYEE">
    <id name="employee_Id" column="EMPLOYEE_ID">
        <generator class="native"/>
    </id>
    <many-to-one name="department" column="DEPARTMENT_ID" not-null="true"/>
</class>
Department.hbm.xml
<class name="Department" table="T_DEPARTMENT"> <id name="department_Id" column="DEPARTMENT_ID"> <generator class="native"/> </id> </class> create table EMPLOYEE(employee_Id bigint not null primary key,department_Id bigint not null) create table DEPARTMENT(department_Id bigint not null primary key)

?单向的<many-to-one>里没有指明class

1.1.2 One-t-one

1>单向一对一和单向多对一区别就是Unique这个属性,基于外键

<class name="Employee" table="T_EMPLOYEE">
    <id name="employee_Id" column="EMPLOYEE_ID">
        <generator class="native"/>
    </id>
    <many-to-one name="department"
                           column="DEPARTMENT_ID" 
                           unique="true"
                           not-null="true"/>
</class>

<class name="Department" table="T_DEPARTMENT">
    <id name="department_Id" column="DEPARTMENT_ID">
        <generator class="native"/>
    </id>
</class>    

2>基于主键

<class name="Person" table="Person">
    <id name="Person_Id" column="PERSON_ID">
        <generator class="native"/>
    </id>
</class>

<class name="Card" table="Card">
    <id name="Card_Id" column="PERSON_ID">
        <generator class="foreign">
            <param name="property">person</param>
        </generator>
    </id>
    <one-to-one name="person" constrained="true"/>
</class>

create table Person ( PERSON_ID  bigint not null primary key )
create table Card( PERSON_ID bigint not null primary key )

? one-to-one 没有column和table属性,有class属性,name标志?,如何指定person对象。

1.1.3 One-to-many

<class name="Department">
    <id name="department_Id" column="DEPARTMENT_ID">
        <generator class="native"/>
    </id>
    <set name="employee">
        <key column="DEPARTMENT_ID" 
            not-null="true"/>
        <one-to-many class="Employee"/>
    </set>
</class>

<class name="Employee">
    <id name="employee_Id" column="EMPLOYEE_ID">
        <generator class="native"/>
    </id>
</class>

create table Department( department_Id bigint not null primary key )
create table Emplyee( employee_Id bigint not null primary key, personId bigint not null )

you should instead use a join table for this kind of asociation

二、单向关联with join table

2.1.1 One-to-many

<class name="Department">
    <id name="department_Id" column="DEPARTMENT_ID">
        <generator class="native"/>
    </id>
    <set name="employees" table="DepartmetEmployee">
        <key column="DEPARTMENT_ID"/>
        <many-to-many column="EMPLOYEE_ID"
            unique="true"
            class="Employee"/>
    </set>
</class>

<class name="Employee">
    <id name="employee_Id" column="EMPLOYEE_ID">
        <generator class="native"/>
    </id>
</class>

create table Department( Department_Id bigint not null primary key )
create table DepartmentEmployee(Department_Id bigint not null, employee_Id bigint not null primary key ) 
create table Employee( employee_Id bigint not null primary key )

specifying unique="ture" change multiplicity from many-to-many to one-to-many.

2.1.2.Many-to-one

<class name="Department">
    <id name="department_Id" column="DEPARTMENT_ID">
        <generator class="native"/>
    </id>
</class>

<class name="Employee">
    <id name="employee_Id" column="EMPLOYEE_ID">
        <generator class="native"/>
    </id>
    <join table="EmployeeDepartment" 
        optional="true">
        <key column="EMPLOYEE_ID" unique="true"/>
        <many-to-one name="department"
            column="DEPARTMENT_ID" 
            not-null="true"/>
    </join>
</class>

2.1.3 One-to-one

<class name="Person" table="Person">
    <id name="Person_Id" column="PERSON_ID">
        <generator class="native"/>
    </id>
    <join table="PersonCard" 
        optional="true">
        <key column="PERSON_ID" 
            unique="true"/>
        <many-to-one name="card"
            column="CARD_ID" 
            not-null="true"
            unique="true"/>
       </join>
</class>

<class name="Card" table="Card">
    <id name="Card_Id" column="CARD_ID">
        <generator class="native"/>
    </id>
    <one-to-one name="person" constrained="true"/>
</class>

create table Person ( PERSON_ID  bigint not null primary key )
create table PersonCard ( PERSON_ID bigint not null primary key, CARD_ID bigint not null unique )
create table Card( CARD_ID bigint not null primary key )

2.1.4.Many-to-many

<class name="Person">
    <id name="id" column="personId">
        <generator class="native"/>
    </id>
    <set name="addresses" table="PersonAddress">
        <key column="personId"/>
        <many-to-many column="addressId"
            class="Address"/>
    </set>
</class>

<class name="Address">
    <id name="id" column="addressId">
        <generator class="native"/>
    </id>
</class>

create table Person ( personId bigint not null primary key )
create table PersonAddress ( personId bigint not null, addressId bigint not null, primary key (personId, addressId) )
create table Address ( addressId bigint not null primary key )

三、双向关联(Bidirectional associations)

3.1.1.one-to-one

1>

<class name="Person">
    <id name="id" column="personId">
        <generator class="native"/>
    </id>
    <one-to-one name="address"/>
</class>

<class name="Address">
    <id name="id" column="personId">
        <generator class="foreign">
            <param name="property">person</param>
        </generator>
    </id>
    <one-to-one name="person" 
        constrained="true"/>
</class>
create table Person ( personId bigint not null primary key )
create table Address ( personId bigint not null primary key )

2>

<class name="Person">
    <id name="id" column="personId">
        <generator class="native"/>
    </id>
    <many-to-one name="address" 
        column="addressId" 
        unique="true"
        not-null="true"/>
</class>

<class name="Address">
    <id name="id" column="addressId">
        <generator class="native"/>
    </id>
   <one-to-one name="person" 
        property-ref="address"/>
</class>

create table Person ( personId bigint not null primary key, addressId bigint not null unique )
create table Address ( addressId bigint not null primary key )

3.1.2.one-to-many/many-to-one:

1>

<class name="Person">
    <id name="id" column="personId">
        <generator class="native"/>
    </id>
    <many-to-one name="address" 
        column="addressId"
        not-null="true"/>
</class>

<class name="Address">
    <id name="id" column="addressId">
        <generator class="native"/>
    </id>
    <set name="people" inverse="true">
        <key column="addressId"/>
        <one-to-many class="Person"/>
    </set>
</class>

create table Person ( personId bigint not null primary key, addressId bigint not null )
create table Address ( addressId bigint not null primary key )

2>

<class name="Person">
   <id name="id"/>
   ...
   <many-to-one name="address"
      column="addressId"
      not-null="true"
      insert="false"
      update="false"/>
</class>

<class name="Address">
   <id name="id"/>
   ...
   <list name="people">
      <key column="addressId" not-null="true"/>
      <list-index column="peopleIdx"/>
      <one-to-many class="Person"/>
   </list>
</class>

 四、双向关联with join table

4.1.1.one-to-many/many-to-one

4.1.2.one-to-one

4.1.3.many-to-many

原文地址:https://www.cnblogs.com/Nyan-Workflow-FC/p/4757942.html