List映射和map最大的区别在于,list的index不是作为key出现,而是作为索引出现,我们使用list映射,可以将list的索引持久到数据库中
数据库结构:
CREATE TABLE `team1` (
`id` varchar(50) NOT NULL,
`name` varchar(50) default NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=gb2312;

CREATE TABLE `member1` (
`id` varchar(50) NOT NULL,
`name` varchar(50) default NULL,
`age` varchar(50) default NULL,
`team` varchar(50) default NULL,
`teamRole` varchar(50) default NULL,
KEY `fk_vote_no` (`id`),
CONSTRAINT `fk_vote_no` FOREIGN KEY (`team`) REFERENCES `team` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=gb2312;
持久类:
package listonetomany;

import java.util.LinkedList;
import java.util.List;
import java.util.Map;


public class Team ...{
private String id;
private String name;
private List members=new LinkedList();

public String getId() ...{
return id;
}

public void setId(String id) ...{
this.id = id;
}




public List getMembers() ...{
return members;
}

public void setMembers(List members) ...{
this.members = members;
}

public String getName() ...{
return name;
}

public void setName(String name) ...{
this.name = name;
}
}


package listonetomany;


public class Member ...{
private String id;
private String name;
private String teamNumber;
private Team team;
private String age;

public String getAge() ...{
return age;
}

public void setAge(String age) ...{
this.age = age;
}


public String getName() ...{
return name;
}

public void setName(String name) ...{
this.name = name;
}



public String getTeamNumber() ...{
return teamNumber;
}

public void setTeamNumber(String teamNumber) ...{
this.teamNumber = teamNumber;
}

public String getId() ...{
return id;
}

public void setId(String id) ...{
this.id = id;
}

public Team getTeam() ...{
return team;
}

public void setTeam(Team team) ...{
this.team = team;
}
}

映射文件:
其中 <index type="string" column="teamRole"/>指明了由member表的teamNumber字段保存list索引
测试代码:

public static void main(String[] args) ...{
Configuration cfg=new Configuration();
cfg.configure();
SessionFactory sf=cfg.buildSessionFactory();
Session session=sf.openSession();
Transaction t=session.beginTransaction();

Team team=new Team();
team.setName("足球队-01");

Member m1=new Member();
m1.setName("01队01号");
m1.setAge("22");
m1.setTeam(team);
Member m2=new Member();
m2.setName("01队02号");
m2.setAge("33");
m2.setTeam(team);

// team.getMembers().add(m1);
// team.getMembers().add(m2);
team.getMembers().add(m1);
team.getMembers().add(m2);
session.save(team);
// session.save(m1);
// session.save(m2);

t.commit();
System.out.println("success");

}
运行结果:
Hibernate: insert into team6 (name, id) values (?, ?)
Hibernate: insert into member6 (name, age, teamNumber, team, id) values (?, ?, ?, ?, ?)
Hibernate: insert into member6 (name, age, teamNumber, team, id) values (?, ?, ?, ?, ?)
Hibernate: update member6 set team=?, teamNumber=? where id=?
Hibernate: update member6 set team=?, teamNumber=? where id=?
4028801811692008011169200b890002 | 01队01号 | 22 | 4028801811692008011169200b4b0001 | 0 |
4028801811692008011169200b890003 | 01队02号 | 33 | 4028801811692008011169200b4b0001 | 1 |
可以看到,数据表中保存了两次add的index----0和1