Hibernate 集合类型使用

为了映射实体中的集合属性,Hibernate提供了set, list, array, bag, map类型。

[color=violet][size=small]1. set[/size][/color]
经常使用,实体对象不重复,没有顺序。对应实体类中的java.util.Set类型。

[color=violet][size=small]2. list[/size][/color]
可以记录实体插入数据库的顺序。对应实体类中的java.util.List类型。

修改Department类:

private List<Employee> employees;
// Getters and setters are omitted


修改Department.hbm.xml:

<class name="Department">
<list name="employees" lazy="true">
<key column="depart_id" not-null="true"/>
<list-index column="em_order"/>
<one-to-many class="Employee"/>
</list>
</class>

key指定employee表中的外键名。
list-index指定employee表中记录插入次序的字段。

Hibernate启动后,会生成下面的employee表:
[table]
| id | name | depart_id | em_order |
[/table]

[color=violet][size=small]3. bag[/size][/color]
和list类似,也是对应实体类中的java.util.List类。不同的是没有记录记录插入的顺序。

修改Department类:
和2相同。

修改Department.hbm.xml

<class name="Department">
<bag name="employees">
<key column="depart_id"/>
<one-to-many class="Employee"/>
</bag>
</class>


生成的employee表:
[table]
| id | name | depart_id |
[/table]

[color=violet][size=small]4. array[/size][/color]
和list类似,可以记录插入次序。对应的是实体类中的数组。

修改Department类:

private Employee[] employees;


修改Department.hbm.xml:

<class name="Department">
<array name="employees" cascade="save-update">
<key column="department_id" not-null="true"/>
<list-index column="emp_index" base="1"/>
<one-to-many class="Employee"/>
</array>
</class>

base指定序号从多少开始。

[color=violet][size=small]5. map[/size][/color]
不仅映射属性值,还映射属性键。所以,除了指定外键列外,还需要指定属性键列(如果没有指定,hibernate会默认生成一列)。系统将以外键列和key列作为联合主键。

修改Department类:

private Map<String, Employee> employees;
// Getters and setters are omitted


修改Department.hbm.xml:

<class name="Department">
<map name="employees" cascade="save-update">
<key column="department_id"/>
<map-key type="java.lang.String" column="ind"/>
<one-to-many class="Employee"/>
</map>
</class>


在Employee类和映射文件中加入ind的声明。

测试代码:

public void testMapSave() {
Session s = null;
Transaction tx = null;

Department depart = new Department("FDI");
Employee em1 = new Employee("Jacy");
Employee em2 = new Employee("Neil");
Map<String, Employee> employees = new HashMap<String, Employee>();
employees.put(em1.getName(), em1);
employees.put(em2.getName(), em2);
depart.setEmployees(employees);

try {
s = HibernateUtil.getSession();
tx = s.beginTransaction();
s.save(depart);
tx.commit();
} catch (HibernateException e) {
if (tx != null)
tx.rollback();
e.printStackTrace();
} finally {
if (s != null)
s.close();
}
}


生成的employee表:
[table]
| id | name | ind | department_id |
| 1 | Jacy | Jacy | 1 |
| 2 | Neil | Neil | 1 |
[/table]
在代码中指定的键就会保存到ind列中。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值