Hibernateコンポーネント(Component)マッピング
コンポーネントマッピング
Component(コンポーネント)は、参照されるエンティティではなく値タイプとして永続化されるオブジェクトです.component(コンポーネント)という用語は、オブジェクト向けの合成概念を指します.(システムフレームワーク階層上のコンポーネントの概念ではありません).hibernateでは、Componentノードの定義を使用して複雑なデータテーブルの細分化を完了できます.hibernateの意味では、インスタンスオブジェクトの論理構成の1つをComponent(コンポーネント)と呼びます.Component(コンポーネント)とエンティティオブジェクトの根本的な違いは、Component(コンポーネント)に識別子(identity)がなく、論理構成として完全にエンティティオブジェクトに属していることです.
コンポーネントマッピングは、私の最初のhibernateインスタンスを例に挙げて説明します.
Userエンティティクラスは次のとおりです.
Nameクラスは次のとおりです.
User.hbm.xmlマッピングファイルは次のとおりです.
テストクラスは次のとおりです.
テストプログラムが実行されると、データベースにuserテーブルが生成され、文が次のように作成されます.
次のようにデータベースに記録されます.
+----+------------+-----------+----------+ | id | first_name | last_name | birthday | +----+------------+-----------+----------+ | 1 | long | xiao | NULL | +----+------------+-----------+----------+ 1 row in set (0.00 sec)
Component(コンポーネント)は、参照されるエンティティではなく値タイプとして永続化されるオブジェクトです.component(コンポーネント)という用語は、オブジェクト向けの合成概念を指します.(システムフレームワーク階層上のコンポーネントの概念ではありません).hibernateでは、Componentノードの定義を使用して複雑なデータテーブルの細分化を完了できます.hibernateの意味では、インスタンスオブジェクトの論理構成の1つをComponent(コンポーネント)と呼びます.Component(コンポーネント)とエンティティオブジェクトの根本的な違いは、Component(コンポーネント)に識別子(identity)がなく、論理構成として完全にエンティティオブジェクトに属していることです.
コンポーネントマッピングは、私の最初のhibernateインスタンスを例に挙げて説明します.
Userエンティティクラスは次のとおりです.
package eg;
public class User {
private int id;
private Name name;//Name
private Date birthday;
//setter getter
}
Nameクラスは次のとおりです.
package eg;
public class Name {
private String firstName;
private String lastName;
// setter getter
}
User.hbm.xmlマッピングファイルは次のとおりです.
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="eg.User" >
<id name="id" >
<generator class="native" />
</id>
<component name="name">
<property name="firstName" column="first_name" />
<property name="lastName" column="last_name" />
</component>
<property name="birthday" />
</class>
</hibernate-mapping
テストクラスは次のとおりです.
public class TestUser {
@Test
public void test1(){
Configuration config = new Configuration();
config.configure();
SessionFactory factory = config.buildSessionFactory();
Session session = factory.openSession();
Transaction tran = session.beginTransaction();
User user = new User();
Name name = new Name();
name.setFirstName("long");
name.setLastName("xiao");
user.setName(name);
user.setBirthday(new Date());
session.save(user);
tran.commit();
session.close();
}
}
テストプログラムが実行されると、データベースにuserテーブルが生成され、文が次のように作成されます.
DROP TABLE IF EXISTS `test`.`user`;
CREATE TABLE `test`.`user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`first_name` varchar(255) DEFAULT NULL,
`last_name` varchar(255) DEFAULT NULL,
`birthday` datetime DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
次のようにデータベースに記録されます.
+----+------------+-----------+----------+ | id | first_name | last_name | birthday | +----+------------+-----------+----------+ | 1 | long | xiao | NULL | +----+------------+-----------+----------+ 1 row in set (0.00 sec)