Hibernate持久化类(Map)集合属性的Key为组件的映射

1.hibernate.cfg.xml

 代码如下 复制代码

<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
<session-factory>
    <!-- 配置数据库方言 -->
    <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
    <!-- 配置数据库的驱动 -->
    <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
    <!-- 配置数据库用户名 -->
    <property name="hibernate.connection.username">root</property>
    <!-- 配置数据库的密码 -->
    <property name="hibernate.connection.password">root</property>
    <!-- 配置数据库的url -->
    <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate</property>
    <!-- 配置数据池的最大容量 -->
    <property name="hibernate.c3p0.max_size">20</property>
    <!-- 配置数据池的最小容量 -->
    <property name="hibernate.c3p0.min_size">1</property>
    <!-- 配置数据链接的超时界限 -->
    <property name="hibernate.c3p0.timeout">5000</property>
    <!-- 在控制台显示后台是否打印执行的sql -->
    <property name="hibernate.show_sql">true</property>
    <!-- 是否以友好的格式显示打印的sql -->
    <property name="hibernate.format_sql">true</property>
    <!-- 打印一些辅助性的注释 -->
    <property name="hibernate.use_sql_comments">true</property>

    <property name="hibernate.c3p0.max_statements">100</property>
    <property name="hibernate.c3p0.idle_test_period">3000</property>
    <property name="hibernate.c3p0.acquire_increment">2</property>
    <property name="hibernate.c3p0.validate">true</property>
    <!-- 配置数据操作的方式 -->
    <property name="hbm2ddl.auto">create</property>
    <!-- 将我们上面 Member 的映射文件添加进来 -->
    <mapping resource="org/Rudiment/hibernate/Member.hbm.xml" />
</session-factory>
</hibernate-configuration>

2.持久化类 Member.java

 代码如下 复制代码

package org.Rudiment.hibernate;

import java.util.HashMap;
import java.util.Map;

public class Member {
    private Integer id;
    private String name;
    private Integer age;
    private Map<Address, String> addresses = new HashMap<Address, String>();
 
    public Map<Address, String> getAddresses() {
        return addresses;
    }
    public void setAddresses(Map<Address, String> addresses) {
        this.addresses = addresses;
    }
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Integer getAge() {
        return age;
    }
    public void setAge(Integer age) {
        this.age = age;
    }
   
}

3.持久化类的组件类 Address.java

 代码如下 复制代码

package org.Rudiment.hibernate;

import java.util.HashMap;
import java.util.Map;

public class Address {

    private String street;
    private String zipCode;
    private String city;

    private Member owner;
   
    public Member getOwner() {
        return owner;
    }
    public void setOwner(Member owner) {
        this.owner = owner;
    }
    public String getStreet() {
        return street;
    }
    public void setStreet(String street) {
        this.street = street;
    }
    public String getZipCode() {
        return zipCode;
    }
    public void setZipCode(String zipCode) {
        this.zipCode = zipCode;
    }
    public String getCity() {
        return city;
    }
    public void setCity(String city) {
        this.city = city;
    }
}

4.持久化类的映射文件 Member.cfg.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">
<!-- Generated 2013-9-9 19:50:34 by Hibernate Tools 3.4.0.CR1 -->
<hibernate-mapping package="org.Rudiment.hibernate">
    <class name="Member" table="TEST_MEMBER">
        <id name="id" column="ID">
            <generator class="native"></generator>
        </id>
        <property name="age" column="AGE"></property>
        <property name="name" column="NAME"></property>
        <map name="addresses" table="test_component">
            <key column="component_id" not-null="true" />
            <composite-map-key class="Address">
                <key-property name="street" column="home_street" type="string" />
                <key-property name="zipCode" column="home_zip_code" type="string" />
                <key-property name="city" column="home_city" type="string" />
            </composite-map-key>
            <element column="address_name" type="string" />
        </map>
    </class>
</hibernate-mapping>

5.持久化类的操纵类 MemberHandler.java

 代码如下 复制代码

package org.Rudiment.hibernate;

import java.util.HashMap;
import java.util.Map;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.service.ServiceRegistryBuilder;

public class MemberHandler {

     public static void insert() {
             Configuration conf = new Configuration();
             conf.configure();
             ServiceRegistry sr = new ServiceRegistryBuilder().applySettings(conf.getProperties()).buildServiceRegistry();
             SessionFactory sf = conf.buildSessionFactory(sr);
             Session session = sf.openSession();
            session.beginTransaction();
            Member m = new Member();
            m.setAge(24);
            m.setName("Louis");
           
            Address ad1 = new Address();
            ad1.setCity("广州");
            ad1.setOwner(m);
            ad1.setStreet("一号街");
            ad1.setZipCode("123");

            Address ad2 = new Address();
            ad2.setCity("深圳");
            ad2.setOwner(m);
            ad2.setStreet("二号街");
            ad2.setZipCode("456");

            Map<Address, String> am = new HashMap<Address, String>();
            am.put(ad1,"地址一");
            am.put(ad2,"地址二");

            m.setAddresses(am);
           
            session.save(m);
            session.getTransaction().commit();
            session.close();
        }
   
    public static void main(String[] args) {
            insert();
    }
}

 

注:

当运行MemberHandler的时候将发现,后台数据库多了一个 test_member 和 test_component 的数据表,表的内容如下:

 代码如下 复制代码

mysql> select * from test_member;
+----+------+-------+
| ID | AGE  | NAME  |
+----+------+-------+
|  1 |   24 | Louis |
+----+------+-------+
1 row in set (0.00 sec)

mysql> select * from test_component;
+--------------+--------------+-------------+---------------+-----------+
| component_id | address_name | home_street | home_zip_code | home_city |
+--------------+--------------+-------------+---------------+-----------+
|            1 | 地址一       | 一号街      | 123           | 广州      |
|            1 | 地址二       | 二号街      | 456           | 深圳      |
+--------------+--------------+-------------+---------------+-----------+
2 rows in set (0.00 sec)

mysql> desc test_member;
+-------+--------------+------+-----+---------+----------------+
| Field | Type         | Null | Key | Default | Extra          |
+-------+--------------+------+-----+---------+----------------+
| ID    | int(11)      | NO   | PRI | NULL    | auto_increment |
| AGE   | int(11)      | YES  |     | NULL    |                |
| NAME  | varchar(255) | YES  |     | NULL    |                |
+-------+--------------+------+-----+---------+----------------+
3 rows in set (0.02 sec)

mysql> desc test_component;
+---------------+--------------+------+-----+---------+-------+
| Field         | Type         | Null | Key | Default | Extra |
+---------------+--------------+------+-----+---------+-------+
| component_id  | int(11)      | NO   | PRI | NULL    |       |
| address_name  | varchar(255) | YES  |     | NULL    |       |
| home_street   | varchar(255) | NO   | PRI | NULL    |       |
| home_zip_code | varchar(255) | NO   | PRI | NULL    |       |
| home_city     | varchar(255) | NO   | PRI | NULL    |       |
+---------------+--------------+------+-----+---------+-------+
5 rows in set (0.02 sec)

时间: 2024-12-21 13:21:04

Hibernate持久化类(Map)集合属性的Key为组件的映射的相关文章

Java中Hibernate持久化类(map)集合属性的元素为组件的映射

1.hibernate.cfg.xml  代码如下 复制代码 <!DOCTYPE hibernate-configuration PUBLIC         "-//Hibernate/Hibernate Configuration DTD 3.0//EN"         "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> <hibernate-configuratio

Javascript实现的Map集合工具类完整实例_javascript技巧

本文实例讲述了Javascript实现的Map集合工具类.分享给大家供大家参考.具体如下: var Map = function(){ // 构造entry实体 var Entry = function(key, value){ this.key = key; this.value = value; } this.entries = new Array(); // 构造put方法在数组中放入一个Entry this.put = function(key, value){ // 数组中已存在就不放

Hibernate含List属性的持久化类的CRUD操作范例

1.hibernate.cfg.xml  代码如下 复制代码 <!DOCTYPE hibernate-configuration PUBLIC         "-//Hibernate/Hibernate Configuration DTD 3.0//EN"         "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> <hibernate-configuratio

Hibernate之集合映射的使用(Set集合映射,list集合映射,Map集合映射)

a:数据库的相关知识: (1):一个表能否有多个主键:不能: (2):为什么要设置主键:数据库存储的数据都是有效的,必须保持唯一性: (3)为什么id作为主键:因为表中通常找不到合适的列作为唯一列,即主键,所有为了方便用id列,因为id是数据库系统维护可以保证唯一,所以就把这列作为主键,简单的说为了方便:如果找不到合适的列,除了使用id列以为作为主键,也可以使用联合主键,即多列的值作为一个主键,从而确保了记录的唯一性,即为联合主键: Hibernate的映射很重要哦,如果是一般的映射,很容易掌握

解析Java的Hibernate框架中的持久化类和映射文件_java

持久化类Hibernate的整个概念是采取从Java类属性的值,并将持久到数据库表.一个映射文件Hibernate的帮助确定如何从拉动类的值,并将它们映射与表和相关的域. 其对象或实例将存储在数据库表中的Java类在Hibernate中称为持久化类. Hibernate的效果最好,如果这些类遵循一些简单的规则,也称为普通Java对象(POJO)编程模型.有下列持久化类的主要规则,但是,这些规则并不是必需的. 将所有的持久化Java类需要一个默认的构造函数. 所有类应该包含为了让容易识别对象内Hi

hibernate 根据持久化类 创建数据库表的时候出现的错误如下,请大神帮忙解决?

问题描述 hibernate 根据持久化类 创建数据库表的时候出现的错误如下,请大神帮忙解决? 十二月 09, 2015 1:49:52 下午 org.hibernate.tool.hbm2ddl.DatabaseMetadata getTableMetadata 信息: table not found: DIC_TAB 十二月 09, 2015 1:49:52 下午 org.hibernate.tool.hbm2ddl.DatabaseMetadata getTableMetadata 信息:

简介Java的Hibernate框架中的Session和持久化类_java

SessionSession对象用于获取与数据库的物理连接. Session对象是重量轻,设计了一个互动是需要与数据库每次被实例化.持久化对象被保存,并通过一个Session对象中检索. 会话中的对象不应该保持开放很长一段时间,因为他们通常不被线程安全的,他们应该被创建并根据需要摧毁他们.这次会议的主要功能是提供创建,读取和删除操作映射的实体类的实例.实例中可能存在以下三种状态之一在给定时间点: 短暂性: 持久化类的未与会话相关联,并在数据库中没有代表性,没有标识值的新实例被Hibernate认

Hibernate映射集合属性、映射组件属性和关联映射都是几张数据表之间的映射的问题,它们在应用上有什么区别?分别应用在什么场合?它们的效率的比较如何?

问题描述 Hibernate映射集合属性.映射组件属性和关联映射都是几张数据表之间的映射的问题,它们在应用上有什么区别?分别应用在什么场合?它们的效率的比较如何?我刚学hibernate,希望诸位前辈赐教!!! 解决方案 解决方案二:请加我QQ,我有视屏教程讲的很细解决方案三:50307924

Freemarker如何获取map集合的第一个key????????

问题描述 Freemarker如何获取map集合的第一个key???????? 想获取key的值,而不是key对应的value值 想获取key的值,而不是key对应的value值**** 解决方案 C++ map通过key获取valueMap 根据value 获取keyFreeMarker集合(List.Map)