Hibernate学习_015_集合映射

关于集合映射,在前面我们已经用到了Set类型,这个是我们一般推荐使用的类型,它主要的特征就是集合里面不可以存放相同的元素。

这里我们主要讲解一下List和Map这两种类型。还是拿Goup和User这个一对多的双向来示例。由于只需要在一的一段使用集合,所以这里的User还是和以前一样,没变,变化的只是Group类的注释,而且相对简单,所以这里只给出相关的Group类和相关的测试代码:

List集合

@Entity
@Table(name="t_group")
public class Group {
	private int id;
	private String name;
	private List<User> users = new ArrayList<User>();
	@Id
	@GeneratedValue
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	@OneToMany(mappedBy="group",cascade=CascadeType.ALL)
	@OrderBy("name ASC")
	public List<User> getUsers() {
		return users;
	}
	public void setUsers(List<User> users) {
		this.users = users;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
}
首先,使用@OneToMany声明这是一个一对多的关联映射,由于List有一个很特殊的特点(其中的元素可排序),所以我们使用@OrderBy这个注解说明当我们通过Group对象取出User集合的时候,里面的User对象按照属性name 升序排列。现骨干的测试代码如下:

@Test
	public void saveGroupAndUsers(){
		Session s = sessionFactory.getCurrentSession();
		s.beginTransaction();
		Group g = new Group();
		g.setName("g1");
		User u1 = new User();User u2 = new User();User u3 = new User();
		u1.setName("u1");u2.setName("u2");u3.setName("u3");
		g.getUsers().add(u1);g.getUsers().add(u3);g.getUsers().add(u2);
		u1.setGroup(g);u2.setGroup(g);u3.setGroup(g);
		s.save(g);
		s.getTransaction().commit();
	}
	@Test
	public void getGroup(){
		saveGroupAndUsers();
		Session s = sessionFactory.getCurrentSession();
		s.beginTransaction();
		Group g = (Group)s.get(Group.class, 1);
		List<User> list = g.getUsers();
		for(User u : list){
			System.out.println(u.getName());
		}
		s.getTransaction().commit();
	}
运行以上测试,我们会发现,尽管我们是存入Group.users中的时候,是按照u1,u3,u2的顺序存放的,但是当我们取出数据打印的时候,发现打印顺序是按照u1,u2,u3的顺序打印的。

Map集合

Map集合里面所有元素都是由键值对组成。比较简单,直接给出代码示例:

@Entity
@Table(name="t_group")
public class Group {
	private int id;
	private String name;
	private Map<Integer,User> users = new HashMap<Integer,User>();
	@Id
	@GeneratedValue
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	@OneToMany(mappedBy="group" ,cascade=CascadeType.ALL)
	@MapKey(name="id")
	public Map<Integer, User> getUsers() {
		return users;
	}
	public void setUsers(Map<Integer, User> users) {
		this.users = users;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
}
测试代码如下:

@Test
	public void getGroup(){
		saveGroupAndUsers();
		Session s = sessionFactory.getCurrentSession();
		s.beginTransaction();
		Group g = (Group)s.get(Group.class, 1);
		Map<Integer,User> users = g.getUsers();
		for(Map.Entry<Integer, User> entry: users.entrySet()){
			System.out.println(entry.getValue().getName());
		}
		s.getTransaction().commit();
	}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值