1.Set
前面我们已经用过,就不再说。

2.List
Group.java:

package cn.edu.hpu.listMapping;


import java.util.ArrayList;
import java.util.List;


import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;


@Entity
@Table(name="m_group")
public class Group {
	private int id;
	private String name;
	private List<User> users=new ArrayList<User>();
	
	
	@OneToMany(mappedBy="group",
			cascade={CascadeType.ALL},
			fetch=FetchType.LAZY
		)
	public List<User> getUsers() {
		return users;
	}
	public void setUsers(List<User> users) {
		this.users = users;
	}
	@Id
	@GeneratedValue
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
		
}


User.java:


package cn.edu.hpu.listMapping;


import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
import javax.persistence.Table;


@Entity
@Table(name="m_user")
public class User {
	private int id;
	private String name;
	private Group group;
	
	//只要有双向就要指定制定一个属性(mapedby)
	//不指定的话会有两个相同的字段产生
    @ManyToOne(cascade={CascadeType.ALL},fetch=FetchType.EAGER)
	public Group getGroup() {
		return group;
	}
	public void setGroup(Group group) {
		this.group = group;
	}
	@Id
	@GeneratedValue
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	
}


在hibernate.cfg.xml中配置:


<mapping class="cn.edu.hpu.listMapping.Group"/>
<mapping class="cn.edu.hpu.listMapping.User"/>



执行测试,输出的sql语句:



alter table m_user 

         drop 

         foreign key FKBF71E05DA3D1B4E0



     drop table if exists m_group



     drop table if exists m_user



     create table m_group (

         id integer not null auto_increment,

         name varchar(255),

         primary key (id)

     )



     create table m_user (

         id integer not null auto_increment,

         name varchar(255),

         group_id integer,

         primary key (id)

     )



     alter table m_user 

         add index FKBF71E05DA3D1B4E0 (group_id), 

         add constraint FKBF71E05DA3D1B4E0 

         foreign key (group_id) 

         references m_group (id)


成功创建m_user与m_group表,并且在user里建立了group的外键关联关系。


这时候,我们在group中取user数据的时候,要用list来取。



原则上来说,用set和list的区别不大,但是,当我们对取出的数据进行排序的时候,用list比较方便(set不支持排序)。



排序可以设定任意属性进行排序,也可以使用联合属性进行排序。


这里我们可以通过设定Annotation注解来设定:


@OrderBy
public List<User> getUsers() {
		return users;
	}
//@OrderBy默认按主键id排序
//@OrderBy("X DESC")/@OrderBy("X ASC")指按照X属性的ASC(升序)或DESC(降序)排序


其实完全可以不这么做,因为HQL语句就可以实现从数据库取数据的时候进行orderBy排序了。



3.Map


User.java一样,Group中的users变成Map形式。Map的Key值设置为主键(因为Key值不能重复),value设为User。


package cn.edu.hpu.listMapping;

import java.util.HashMap;
import java.util.Map;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.MapKey;
import javax.persistence.OneToMany;
import javax.persistence.OrderBy;
import javax.persistence.Table;

@Entity
@Table(name="m_group")
public class Group {
	private int id;
	private String name;
        private Map<Integer,User> users=new HashMap<Integer,User>();
	
        @OneToMany(mappedBy="group")
	@MapKey
	public Map<Integer, User> getUsers() {
		return users;
	}
	public void setUsers(Map<Integer, User> users) {
		this.users = users;
	}
	@Id
	@GeneratedValue
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
		
}

其中@MapKey(name="id")指定map的Key值是属性的哪一个值。




建表语句:


alter table m_user 

         drop 

         foreign key FKBF71E05DA3D1B4E0



     drop table if exists m_group



     drop table if exists m_user



     create table m_group (

         id integer not null auto_increment,

         name varchar(255),

         primary key (id)

     )



     create table m_user (

         id integer not null auto_increment,

         name varchar(255),

         group_id integer,

         primary key (id)

     )



     alter table m_user 

         add index FKBF71E05DA3D1B4E0 (group_id), 

         add constraint FKBF71E05DA3D1B4E0 

         foreign key (group_id) 

         references m_group (id)



这样,当我们取users的时候,它会帮我们装到map里。



取出测试(group-g1里面有u1、u2、u3三个user对象):



@Test
public void testMapGroup(){
	sessionFactory=new AnnotationConfiguration().configure().buildSessionFactory();
	Session s=sessionFactory.openSession();
	s.beginTransaction();
	Group g=(Group)s.load(Group.class,1);
	for(Map.Entry<Integer, User> entry:g.getUsers().entrySet()){
		System.out.println(entry.getValue().getName());
	}
	s.getTransaction().commit();
}


输出SQL语句和结果:


Hibernate: 

     select

         group0_.id as id0_0_,

         group0_.name as name0_0_ 

     from

         m_group group0_ 

     where

         group0_.id=?

 Hibernate: 

     select

         users0_.group_id as group3_0_1_,

         users0_.id as id1_,

         users0_.id as formula0_1_,

         users0_.id as id1_0_,

         users0_.group_id as group3_1_0_,

         users0_.name as name1_0_ 

     from

         m_user users0_ 

     where

         users0_.group_id=?

 u1

 u2

u3