在数据库操作中,我们通常会用到多张项关联的表,一个用户通常有多个地址。由此我们便需要用到集合映射。
首先看一下整体结构
Set集合映射
步骤一:创建实体对象类,需要单独建表的属性address用Set<String>集合类型封装。
(此处省略了get() set()方法)
步骤二:配置User.hbm.xml映射表
<hibernate-mapping package="cn.itcast.collection" auto-import="true">
<class name="User" table="table_user">
<id name="id" column="user_id"> <!--配置主键-->
<generator class="native"></generator> <!-- 主键自增长方式(根据数据库自动匹配)-->
</id>
<property name="userName"></property>
<!-- Set集合 元素无放入顺序,元素不可重复 (注意:元素虽然无放入顺序,但是元素在set中的位置是有该元素的HashCode决定的,其位置其实是固定的) -->
<set name="address" table="table_address"> <!--单独映射的table_address表-->
<key column="uid"></key> <!-- 外键-->
<element column="address" type="string"></element> <!-- 映射表中所存放的address数据-->
</set>
</class>
</hibernate-mapping>
步骤三:配置hibernate.cfg.xml
<hibernate-configuration>
<session-factory>
<!-- 数据库连接配置 -->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql:///user</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">root</property>
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="hibernate.show_sql">true</property> <!-- 控制台打印输出数据库sql语句 -->
<property name="hibernate.format_sql">true</property>
<property name="hibernate.hbm2ddl.auto">update</property>
<!-- <mapping resource="cn/itcast/collection/User.hbm.xml"/> --> <!--加载映射文件(这里我们尝试通过类加载,所有这里暂时先注释) -->
</session-factory>
</hibernate-configuration>
步骤四:测试类 App1
public class App1 {
private static SessionFactory sf=null;
static {
sf = new Configuration()
.configure()
.addClass(User.class) // 测试时候使用(自动加载映射文件User.hbm.xml)
.buildSessionFactory();
}
@Test//test set集合映射
public void test1(){
Session session=sf.openSession();
session.beginTransaction();
//---保存
Set<String> addressSet=new HashSet<String>();
addressSet.add("广州");
addressSet.add("深圳");
//用户对象
User user=new User();
user.setUserName("张三");
user.setAddress(addressSet);
//保存
session.save(user);
session.getTransaction().commit();
session.close();
}
}
List集合映射
步骤一:同上,实体类对象中address用List集合存储
步骤二:配置User.hbm.xml映射表 list集合有序,所以这里比set集合多了个<list-index>
<!-- list集合 元素有放入顺序,元素可重复 -->
<list name="addressList" table="table_addressList">
<key column="uid"></key>
<list-index column="idx"></list-index>
<element column="address" type="string"></element>
</list>
步骤三:配置hibernate.cfg.xml,同上。(此处省略)
步骤四:测试
map集合映射
步骤一:同上,实体类对象中address用Map集合存储
步骤二:配置User.hbm.xml映射表
步骤三:配置hibernate.cfg.xml,同上。(此处省略)
步骤四:测试
数组映射
步骤一:
步骤二:配置User.hbm.xml映射表
步骤三:配置hibernate.cfg.xml,同上。(此处省略)
步骤四:测试
最后我们查看一下数据库中的表结构~
hibernate自动建表 table_user
set集合映射的 table_address
List集合映射的 table_addresslist
Map集合映射的table_addressmap
数组映射的table_array