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-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<String, Address> addresses = new HashMap<String, Address>();
   
   
    public Map<String, Address> getAddresses() {
        return addresses;
    }
    public void setAddresses(Map<String, Address> 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.持久化类的组件类

 代码如下 复制代码

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.持久化类的映射文件

 代码如下 复制代码

<?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" />
            <map-key column="component_key" type="string" />
            <composite-element class="Address">
                <parent name="owner"/>
                <property name="street" column="home_street"></property>
                <property name="zipCode" column="home_zip_code"></property>
                <property name="city" column="home_city"></property>
            </composite-element>
        </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<String, Address> am = new HashMap<String, Address>();
            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> show tables;
+---------------------+
| Tables_in_hibernate |
+---------------------+
| test_component      |
| test_member         |
+---------------------+
2 rows in set (0.00 sec)

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 | home_street | home_zip_code | home_city | component_key |
+--------------+-------------+---------------+-----------+---------------+
|            1 | 一号街      | 123           | 广州      | 地址一        |
|            1 | 二号街      | 456           | 深圳      | 地址二        |
+--------------+-------------+---------------+-----------+---------------+
2 rows in set (0.00 sec)

时间: 2024-08-02 15:37:07

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

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-configuratio

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

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

详解java中的Collections类_java

一般来说课本上的数据结构包括数组.单链表.堆栈.树.图.我这里所指的数据结构,是一个怎么表示一个对象的问题,有时候,单单一个变量声明不堪大用,比如int,String,double甚至一维数组.二维数组无法完全表达你要表达的东西,而定义一个类Class有太过麻烦,这时候,你可以考虑一下用Java中的Collections类.使用Collections类,必须在文件头声明import java.util.*; 一.动态.有序.可变大小的一维数组Vector与ArrayList  Collectio

多用多学之Java中的Set,List,Map详解_java

很长时间以来一直代码中用的比较多的数据列表主要是List,而且都是ArrayList,感觉有这个玩意就够了.ArrayList是用于实现动态数组的包装工具类,这样写代码的时候就可以拉进拉出,迭代遍历,蛮方便的. 也不知道从什么时候开始慢慢的代码中就经常会出现HashMap和HashSet之类的工具类.应该说HashMap比较多一些,而且还是面试经典题,平时也会多看看.开始用的时候简单理解就是个键值对应表,使用键来找数据比较方便.随后深入了解后发现 这玩意还有点小奥秘,特别是新版本的JDK对Has

java中Hibernate自动生成的问题 ?

问题描述 java中Hibernate自动生成的问题 ? 我是刚毕业不久的菜鸟,在公司做项目, 用hibernate 自动生成了与表对应的实体类和 增删改查,都是自动生成的 用的时候只需在业务层调用就行, 然后公司来了个两年经验的同事,说: " 现在都没人用Hibernate自动生成了 ,都是用jdbc 做呢, 还有java的注解", 我现在好困惑啊, Hibernate不是封装了jdbc吗? 怎么现在没人用hibernate了反而用jdbc呢? 还有自动生成不是会提高开发效率吗 ?

Java中StringUtils工具类的一些用法实例

  这篇文章主要介绍了Java中StringUtils工具类的一些用法实例,本文着重讲解了isEmpty和isBlank方法的使用,另外也讲解了trim.strip等方法的使用实例,需要的朋友可以参考下 StringUtils 方法的操作对象是 java.lang.String 类型的对象,是 JDK 提供的 String 类型操作方法的补充,并且是 null 安全的(即如果输入参数 String 为 null 则不会抛出 NullPointerException ,而是做了相应处理,例如,如果

java中基于TaskEngine类封装实现定时任务

主要包括如下几个类:   文章标题:java中基于TaskEngine类封装实现定时任务 文章地址: http://blog.csdn.net/5iasp/article/details/10950529 作者: javaboy2012 Email:yanek@163.com qq:    1046011462       1. 核心工具类: TaskEngine   package com.yanek.task; import java.util.*; import java.util.Lin

java-请教JAVA中的Calendar类的一个问题

问题描述 请教JAVA中的Calendar类的一个问题 请问大神,我画红框的部分就是我出问题的地方,为什么我set好的Date值是5月,而下面输出后是0月?搞得下面的add方法也是从0开始加3 解决方案 把SimpleDateFormat中的m改为大写的M,改为"yyyy年MM月dd日".而且要注意,获取到的Month是用0-11表示的,如果要表示真实的日期,要记得+1. 解决方案二: yyyy年M月d日 看看

在java中New 类名() 类里面的数据会被重新赋值吗?

问题描述 在java中New 类名() 类里面的数据会被重新赋值吗? 在java中New 类名() 类里面的数据会被重新赋值吗? 解决方案 java中new 类名()是用来调用类的无参构造器开辟内存空间的,初始化一个该类的对象,而该对象里面的值就是类的初始值.会不会被重新赋值要看无参构造器里面的代码有没有再次赋值的过程. 解决方案二: 你这是新建一个 对象 就相当与数据库表 插入一行数据 解决方案三: 是对象里的数据吧,每次new出来的对象里的数据都会有初始化. 解决方案四: 你类里面的都是初始