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;
`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;
}
}
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");
}
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