Hibernate Hibernate関連マッピング

14019 ワード

Hibernateマッピング関係の概要:
Hibernate関連マッピングは次のように分類されます.
①、多対一.②、ペアが多い.③、一対一.④、多対多.⑤、コンポーネントマッピング.⑥、集合マッピング.
Uml言語での関連付けは方向性があり、顧客Customerと受注Orderの関係を例にとると、1つの顧客は複数の受注を発行することができ、1つの受注は1つの顧客にしか属しません.OrderからCustomerへの関連付けは複数対1です.これは、各OrderオブジェクトがCustomerオブジェクトを参照することを意味します.したがって、Orderクラスでは、関連付けられたCustomerオブジェクトを参照するために、Customerタイプのプロパティを定義する必要があります.CustomerからOrderへは、1対の複数の関連付けられています.これは、各CustomerオブジェクトがOrderオブジェクトのセットを参照することを意味します.したがって、Customerクラスでは、すべての関連付けられたOrderオブジェクトを参照するセットタイプのプロパティを定義する必要があります.OrderからCustomerへの関連のみ、またはCustomerからOrderへの関連のみがある場合は、一方向関連と呼ばれます.2つの関連付けが同時に含まれる場合は、双方向関連付けと呼ばれます.
リレーショナル・データベースでは、外部キー参照関係のみが存在し、常にmany側がone側を参照するため、データ冗長性が解消されるため、実際にはリレーショナル・データベースは多対一または一対一の一方向関連のみをサポートします.
 
一、多対一の一方向関連関係:
1.Orderクラスでcustomer属性を定義し、CustomerクラスでOrderオブジェクトを保存するための集合属性を定義する必要はありません.Orderクラスでcustomerを定義できます.id属性ですが、あまり意味がなく、不便です.したがって、Orderクラスで定義したcustomerプロパティの場合、CustomerタイプとOrdersテーブルの外部キーcustomer_idは対応しているので、次のマッピング方式は間違っています.
<property name="customer" column="customer_id" />             。

上記の構成コードでは、customerプロパティはCustomerタイプであり、Ordersテーブルの外部キーcustomer_idは整数タイプであり、明らかにタイプが一致しないため、要素を使用してcustomer属性をマッピングすることはできません.要素を使用します.
<many-to-one name="customer" column="customer_id" class="Com.edu.bean.Customer" nut-null="true"/>

name:永続化クラスのプロパティ名を設定します.
column:クラスのプロパティに対応するテーブルの外部キーを設定します.
class:永続化クラスのプロパティのタイプを設定します.
not-null:trueの場合、customerプロパティがnullに許可されていないことを示します.このプロパティのデフォルト値はfalseです.
OrderクラスとCustomerクラスはそれぞれ次のとおりです.
public class Customer{
    private String cid;
    private String cname;
    public Customer(){}   //               
    public Customer(String cid,String cname){
     this.cid=cid;
    this.cname=cname;

    } 
    public String getCid() {
      return cid;
     }
     public void setCid(String cid) {
      this.cid = cid;
     }
     public String getCname() {
      return cname;
     }
     public void setCname(String cname) {
      this.cname = cname;
     }
}

   Customer.hbm.xmlファイル:
<hibernate-mapping package="com.edu.bean">
 <class name="Customer" table="sys_customer">
  <id name="cid" column="cid">
   <generator class="assigned"></generator>
  </id>
  <property name="cname" column="cname" ></property> 
 </class>
</hibernate-mapping>

Orderクラス:
package com.edu.bean;
public class Order {
 private String oid;
 private String oname;
 private Customer customer;
 public Order(){}
 public String getOid() {
  return oid;
 }
 public void setOid(String oid) {
  this.oid = oid;
 }
 public String getOname() {
  return oname;
 }
 public void setOname(String oname) {
  this.oname = oname;
 }
 public Customer getCustomer() {
  return customer;
 }
 public void setCustomer(Customer customer) {
  this.customer = customer;
 }
 
}

 Order.hbm.xmlファイル:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.edu.bean">
 <class name="Order" table="sys_order">
  <id name="oid" column="oid">
   <generator class="assigned"></generator>
  </id>
  <property name="oname" column="oname" ></property>
  <many-to-one name="customer" column="customerId" class="Customer"></many-to-one> 
 </class>
</hibernate-mapping>

二、一対多の一方向関連関係:
1、現在のビジネスニーズでは、あるcustomerオブジェクトのすべてのorderを取得することが多いため、便宜上、Hibernateの複数の関連付けられた関係を採用し、CustomerクラスでSetorderセットを定義します.
Customerクラスは次のように変更されました.
public class Customer{
    private String cid;
    private String cname;
    private Set<Order> orders;
     public Set<Order> getOrders() {
      return orders;
     }
     public void setOrders(Set<Order> orders) {
      this.orders= orders;
     }
    public Customer(){}   //               
    public Customer(String cid,String cname){
     this.cid=cid;
    this.cname=cname;

    } 
    public String getCid() {
      return cid;
     }
     public void setCid(String cid) {
      this.cid = cid;
     }
     public String getCname() {
      return cname;
     }
     public void setCname(String cname) {
      this.cname = cname;
     }
}

Customer.hbm.xmlファイルは次のように変更されます.
<hibernate-mapping package="com.edu.bean">
 <class name="Customer" table="sys_customer">
  <id name="cid" column="cid">
   <generator class="assigned"></generator>
  </id>
  <property name="cname" column="cname" ></property> 
 </class>
 <set name="orders">
     <key column="customerId"/>
     <one-to-many class="Order">
     </one-to-many>
 </set>
</hibernate-mapping>

三、一対一の関連関係
Hibernateの一対の第1の関連関係には、共有プライマリ・キー方式と一意の外部キー方式の2つの実装方式がある.このような一対一の関連関係では、オブジェクトはプライマリオブジェクトとセカンダリオブジェクトに分けられます.
1、主キーに基づく一対一の関連関係:
例えばPerson人は身分証明書Idcardが1つしかありません.PersonとIdCardは1対1の関係です.
Personクラス:
 package com.edu.bean;
public class Person {
 private String id;
 private String name;
 private IdCard idcard;
 
 public Person(){}
 public Person(String id,String name,IdCard idcard){
  this.id=id;
  this.name=name;
  this.idcard=idcard;
 }
 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 IdCard getIdcard() {
  return idcard;
 }
 public void setIdcard(IdCard idcard) {
  this.idcard = idcard;
 }
 
}

Person.hbm.xmlファイル
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE hibernate-mapping PUBLIC 
     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
     "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
 <hibernate-mapping package="com.edu.bean">
  <class name="Person" table="sys_person">
   <id name="id" column="id">
    <generator class="assigned"></generator>
   </id>
   <property name="name" column="name" ></property>
   <one-to-one name="idcard"></one-to-one>
  </class>
 </hibernate-mapping>

IdCarクラス:
package com.edu.bean;
public class IdCard {
 private String id;
 private String username;
 private Person person;
 public Person getPerson() {
  return person;
 }
 public void setPerson(Person person) {
  this.person = person;
 }
 public String getId() {
  return id;
 }
 public void setId(String id) {
  this.id = id;
 }
 public String getUsername() {
  return username;
 }
 public void setUsername(String username) {
  this.username = username;
 }
}

IdCard.hbm.xmlファイル
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.edu.bean">
 <class name="IdCard" table="sys_idcard">
  <id name="id" column="id">
   <generator class="foreign">
    <param name="property">person</param>
   </generator>
  </id>
  <property name="username" column="username" ></property>
  <one-to-one name="person" class="Person" constrained="true"></one-to-one>
 </class>
</hibernate-mapping>

ここではHibernateのconstrainedプロパティを使用します.このプロパティはのマッピングでのみ使用できます.constrained=trueの場合、クラスに対応するテーブルと関連するオブジェクトに対応するデータベースとの間で、プライマリ・キーが外部キー参照で制約されていることを示します.このオプションはsave()とdelete()のカスケード実行時の優先順位に影響します.たとえばsaveの場合、constrained=trueの場合、関連テーブルを追加してから、このテーブルを追加し、削除するときは逆になります.
2、外部キーに基づく一対一の関連関係:
Person類及びPerson.hbm.xmlファイルに変更はありません:
IdCardクラス:
package com.edu.bean;
public class IdCard {
 private String id;
 private String username;
 private Person person;
 public Person getPerson() {
  return person;
 }
 public void setPerson(Person person) {
  this.person = person;
 }
 public String getId() {
  return id;
 }
 public void setId(String id) {
  this.id = id;
 }
 public String getUsername() {
  return username;
 }
 public void setUsername(String username) {
  this.username = username;
 }
}

IdCard.hbm.xmlファイルは次のとおりです.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.edu.bean">
 <class name="IdCard" table="sys_idcard">
  <id name="id" column="id">
   <generator class="assigned">
   </generator>
  </id>
  <property name="username" column="username" ></property>
  <many-to-one name="person" column="p_id" class="Person" unique="true"></many-to-one>
  <!-- <one-to-one name="person" class="Person" constrained="true"></one-to-one> -->
 </class>
</hibernate-mapping>

四、多対多関連関係:
リレーショナル・データベース内のエンティティが複数対である場合、通常は中間関連テーブルを作成しますが、Hibernateは同様に中間関連テーブルを作成し、複数対の複数を2つのペアに分割します.
たとえば、クラシックなユーザーロールの問題:
ユーザUserクラス:
 package com.edu.bean;
import java.util.Set;
public class User {
 private String uid;
 private String uname;
 private String password;
 private Set<Role> roles;
 public User(){}
 public User(String uid,String uname,String password){
  this.uid=uid;
  this.uname=uname;
  this.password=password;
 }
 public String getUid() {
  return uid;
 }
 public void setUid(String uid) {
  this.uid = uid;
 }
 public String getUname() {
  return uname;
 }
 public void setUname(String uname) {
  this.uname = uname;
 }
 public String getPassword() {
  return password;
 }
 public void setPassword(String password) {
  this.password = password;
 }
 public Set<Role> getRoles() {
  return roles;
 }
 public void setRoles(Set<Role> roles) {
  this.roles = roles;
 }
}

    User.hbm.xmlファイル:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.edu.bean">
 <class name="User" table="sys_user">
  <id name="uid" column="uid">
   <generator class="assigned"></generator>
  </id>
  <property name="uname" column="uname" ></property>
  <property name="password" column="password"></property>
  <set name="roles" table="user_role">
   <key column="uid"></key>
   <many-to-many class="Role" column="rid"></many-to-many>
  </set>
 </class>
</hibernate-mapping>

ロールクラスRole:
package com.edu.bean;
import java.util.Set;
public class Role {
 private String rid;
 private String rname;
 private Integer ordernum;
 private String description;
 private Set users;
 
 public Role(){}
 public Role(String rid,String rname,Integer ordernum,String description){
  this.rid=rid;
  this.rname=rname;
  this.ordernum=ordernum;
  this.description=description;
 }
 public String getRid() {
  return rid;
 }
 public void setRid(String rid) {
  this.rid = rid;
 }
 public String getRname() {
  return rname;
 }
 public void setRname(String rname) {
  this.rname = rname;
 }
 public Integer getOrdernum() {
  return ordernum;
 }
 public void setOrdernum(Integer ordernum) {
  this.ordernum = ordernum;
 }
 public String getDescription() {
  return description;
 }
 public void setDescription(String description) {
  this.description = description;
 }
 public Set getUsers() {
  return users;
 }
 public void setUsers(Set users) {
  this.users = users;
 }
}

    Role.hbm.xmlファイル
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.edu.bean">
 <class name="Role" table="sys_role">
  <id name="rid" column="rid">
   <generator class="assigned"></generator>
  </id>
  <property name="rname" column="rname" ></property>
  <property name="ordernum" column="ordernum"></property>
  <property name="description" column="description"></property>
  <set name="users" table="user_role">
   <key column="rid"></key>
   <many-to-many class="User" column="uid"></many-to-many>
  </set>
 </class>
</hibernate-mapping>