对于集合元素是组合属性,程序依然使用@ElementCollection修饰集合属性,使用@CollectionTable映射保存集合属性的表。对于带索引的集合,如果是List集合,则使用@OrderColumn映射索引列;如果Map集合,则使用@MapKeyColumn映射索引列。下面是Person类代码:
@Entity
@Table(name="person_inf")
public class Person
{
@Id @Column(name="person_id")
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Integer id;
private int age;
// Map集合元素是组件
@ElementCollection(targetClass=Score.class)
@CollectionTable(name="score_inf",
joinColumns=@JoinColumn(name="person_id" , nullable=false))
@MapKeyColumn(name="subject_name")
@MapKeyClass(String.class)
private Map<String , Score> scores
= new HashMap<>();
// List集合元素是组件
@ElementCollection(targetClass=Name.class)
@CollectionTable(name="nick_inf",
joinColumns=@JoinColumn(name="person_id" , nullable=false))
@OrderColumn(name="list_order")
private List<Name> nicks
= new ArrayList<>();
// id的setter和getter方法
public void setId(Integer id)
{
this.id = id;
}
public Integer getId()
{
return this.id;
}
// age的setter和getter方法
public void setAge(int age)
{
this.age = age;
}
public int getAge()
{
return this.age;
}
// nicks的setter和getter方法
public void setNicks(List<Name> nicks)
{
this.nicks = nicks;
}
public List<Name> getNicks()
{
return this.nicks;
}
// scores的setter和getter方法
public void setScores(Map<String , Score> scores)
{
this.scores = scores;
}
public Map<String , Score> getScores()
{
return this.scores;
}
}
下面是Name的类
@Embeddable
public class Name
{
// 定义first成员变量
@Column(name="person_firstname")
private String first;
// 定义last成员变量
@Column(name="person_lastname")
private String last;
// 引用拥有该Name的Person对象
@Parent
private Person owner;
// 无参数的构造器
public Name()
{
}
// 初始化全部成员变量的构造器
public Name(String first , String last)
{
this.first = first;
this.last = last;
}
// first的setter和getter方法
public void setFirst(String first)
{
this.first = first;
}
public String getFirst()
{
return this.first;
}
// last的setter和getter方法
public void setLast(String last)
{
this.last = last;
}
public String getLast()
{
return this.last;
}
// owner的setter和getter方法
public void setOwner(Person owner)
{
this.owner = owner;
}
public Person getOwner()
{
return this.owner;
}
}
下面是Score类
@Embeddable
public class Score
{
// 定义first成员变量
@Column(name="score_level")
private String level;
// 定义last成员变量
@Column(name="score_mark")
private Integer mark;
// 引用拥有该Name的Person对象
@Parent
private Person owner;
// 无参数的构造器
public Score()
{
}
// 初始化全部成员变量的构造器
public Score(String level , Integer mark)
{
this.level = level;
this.mark = mark;
}
// level的setter和getter方法
public void setLevel(String level)
{
this.level = level;
}
public String getLevel()
{
return this.level;
}
// mark的setter和getter方法
public void setMark(Integer mark)
{
this.mark = mark;
}
public Integer getMark()
{
return this.mark;
}
// owner的setter和getter方法
public void setOwner(Person owner)
{
this.owner = owner;
}
public Person getOwner()
{
return this.owner;
}
}
执行程序如下:
public class PersonManager
{
public static void main(String[] args)
{
PersonManager mgr = new PersonManager();
mgr.createAndStorePerson();
HibernateUtil.sessionFactory.close();
}
private void createAndStorePerson()
{
Session session = HibernateUtil.currentSession();
Transaction tx = session.beginTransaction();
// 创建Person对象
Person person = new Person();
//为Person对象设置属性
person.setAge(29);
//创建一个Map集合
Map<String , Name> nicks =
new HashMap<String , Name>();
// 向List集合里放入Name对象
person.getNicks().add(new Name("Wawa" , "Wawa"));
person.getNicks().add(new Name("Yeeku" , "Lee"));
// 向List集合里放入Score对象
person.getScores().put("语文" , new Score("良好" , 85));
person.getScores().put("数学" , new Score("优秀" , 92));
session.save(person);
tx.commit();
HibernateUtil.closeSession();
}
}