原来我们无论是学习一对多还是多对多,只有有集合的地方我们都是用的set来完成的,如果我们需要用map集合的时候,项目中该怎么实现那;
下面我先来写一个简单的.从数据库看是2个表,但是从实体类看就一个实体类,和一个映射文件:
实体类
public class Customers implements java.io.Serializable {
private Long id;
private String name;
private Map orders;
映射文件
<hibernate-mapping>
<class name="com.wfg.map1.Customers" table="customers" >
<id name="id" type="java.lang.Long">
<column name="ID" />
<generator class="native" />
id>
<property name="name" type="java.lang.String">
<column name="NAME" length="15" />
property>
<map name="orders" table="orders">
<key column="CUSTOMER_ID">key>
<index column="orderNumber" type="java.lang.String">index>
<element column="oderdesc" type="java.lang.String">element>
map>
class>
hibernate-mapping>
测试代码
Customers customers = new Customers();
customers.setId(new Long(1));
customers.setName("customers1");
customers.setOrders(new HashMap());
customers.getOrders().put("zhangsan", "hello ");
customers.getOrders().put("lisi", "word");
customers.getOrders().put("wangwu", "welcom");
session.save(customers);
从上面的例子中我们可以看到orders表中再有其他的信息就不能实现了.我们下面来实现
实体类
public class Team {
private int id;
private String name;
private Map students;
public class Student {
private int id;
private String name;
private String card_id;
private String studendesc;
private Team team;
映射文件
Student映射文件不再介绍和原来说的一对多 多的一方一样有many-to-one标签
team映射文件
<hibernate-mapping>
<class name="com.wfg.map2.Team" table="team" >
<id name="id" type="integer">
<column name="ID" />
<generator class="native" />
id>
<property name="name" type="java.lang.String">
<column name="NAME" length="15" />
property>
<map name="students" table="student" cascade="all">
<key column="team_id">key>
<index column="card_id" type="string">index>
<one-to-many class="com.wfg.map2.Student"/>
map>
class>
hibernate-mapping>
测试代码
Team team = new Team();
team.setName("team1");
team.setStudents(new HashMap());
Student stu = new Student();
stu.setName("张三");
stu.setStudendesc("hello");
Student stu2 = new Student();
stu2.setName("李四");
stu2.setStudendesc("word");
team.getStudents().put("100", stu);
team.getStudents().put("101", stu2);
session.save(team);
不解释下面在map标签中加inverse=”true”
此时是:
但是我去数据库发现
这次解释下为什么,维护inverse=true 也就是说这种关联关系让Student维护,但是Student并不知道card_id,和team_id的值
我将测试代码修改了下
Team team = new Team();
team.setName("team1");
team.setStudents(new HashMap());
Student stu = new Student();
stu.setName("张三");
stu.setStudendesc("hello");
stu.setTeam(team);
stu.setCard_id("200");
Student stu2 = new Student();
stu2.setName("李四");
stu2.setCard_id("201");
stu2.setStudendesc("word");
stu2.setTeam(team);
team.getStudents().put("100", stu);
team.getStudents().put("101", stu2);
session.save(team);
源码下载
链接:http://pan.baidu.com/s/1minxw7m 密码:1oil